diff --git a/PROJECT_LOG.md b/PROJECT_LOG.md index 8558931..44e2782 100644 --- a/PROJECT_LOG.md +++ b/PROJECT_LOG.md @@ -311,3 +311,28 @@ git version 2.51.1.windows.1 - Порог 100 мс вызывает слишком частые безопасные остановки. - Порог 500 мс допускает слишком большой путь до реакции. - Для следующей проверки принята двухступенчатая логика: предварительная реакция после 150 мс и обязательная остановка после 250 мс. + +--- + +# Запись 014 + +## Дата + +5 августа 2026 года + +## Тема + +Завершение Lab039: двухступенчатая безопасная реакция и оценка пути до остановки. + +## Выполнено + +- Lab039 реализует состояния NORMAL, STAGE1_DECELERATION, STAGE2_BRAKING и EMERGENCY_LATCHED. +- Используется точное событийное интегрирование движения. +- Аналитические значения совпали с моделью с нулевой ошибкой. +- Максимальный полный путь составил 13,9642 м. +- При 25 км/ч и номинальном профиле политика 150/250 мс дала полный путь около 9,5388 м. +- Основную часть пути составляет торможение после реакции. +- Пара 150/250 мс сохраняется как предварительный кандидат, но окончательно не утверждается. +- Фактические замедления должны быть измерены на реальном ровере. +- Локальный сторожевой таймер сохранил безопасную реакцию в опытах, где аварийная команда не была доставлена. +- Следующий этап исследует постоянное аварийное намерение наземной станции и безопасное разрешение повторного движения. diff --git a/data/processed/lab039/lab039_analytic_checks.csv b/data/processed/lab039/lab039_analytic_checks.csv new file mode 100644 index 0000000..94d7857 --- /dev/null +++ b/data/processed/lab039/lab039_analytic_checks.csv @@ -0,0 +1,10 @@ +initial_speed_kmh,deceleration_profile,single_reaction_path_m,single_braking_path_m,single_total_analytic_m,single_total_model_m,two_stage_reaction_path_m,two_stage_deceleration_path_m,two_stage_braking_path_m,two_stage_total_analytic_m,two_stage_total_model_m,two_stage_minus_single_m,maximum_absolute_error_m +5.0,soft,0.3472222222222222,0.48225308641975306,0.8294753086419753,0.8294753086419753,0.20833333333333331,0.1363888888888889,0.4481558641975308,0.792878086419753,0.792878086419753,-0.03659722222222228,0.0 +5.0,nominal,0.3472222222222222,0.3215020576131687,0.668724279835391,0.668724279835391,0.20833333333333331,0.1338888888888889,0.276872427983539,0.6190946502057613,0.6190946502057613,-0.04962962962962969,0.0 +5.0,intensive,0.3472222222222222,0.24112654320987653,0.5883487654320987,0.5883487654320987,0.20833333333333331,0.1313888888888889,0.1918557098765432,0.5315779320987655,0.5315779320987655,-0.056770833333333215,0.0 +15.0,soft,1.0416666666666667,4.340277777777779,5.3819444444444455,5.3819444444444455,0.625,0.41416666666666674,4.236736111111112,5.2759027777777785,5.2759027777777785,-0.10604166666666703,0.0 +15.0,nominal,1.0416666666666667,2.893518518518519,3.935185185185186,3.935185185185186,0.625,0.41166666666666674,2.756296296296297,3.7929629629629638,3.7929629629629638,-0.14222222222222225,0.0 +15.0,intensive,1.0416666666666667,2.1701388888888893,3.2118055555555562,3.2118055555555562,0.625,0.40916666666666673,2.016701388888889,3.0508680555555556,3.0508680555555556,-0.16093750000000062,0.0 +25.0,soft,1.7361111111111112,12.056327160493828,13.792438271604938,13.792438271604938,1.0416666666666667,0.6919444444444446,11.883341049382718,13.61695216049383,13.61695216049383,-0.175486111111109,0.0 +25.0,nominal,1.7361111111111112,8.037551440329219,9.77366255144033,9.77366255144033,1.0416666666666667,0.6894444444444445,7.807736625514405,9.538847736625517,9.538847736625517,-0.23481481481481303,0.0 +25.0,intensive,1.7361111111111112,6.028163580246914,7.764274691358025,7.764274691358025,1.0416666666666667,0.6869444444444446,5.770559413580247,7.499170524691358,7.499170524691358,-0.26510416666666714,0.0 diff --git a/data/processed/lab039/lab039_analytic_vs_model.png b/data/processed/lab039/lab039_analytic_vs_model.png new file mode 100644 index 0000000..c436fe3 Binary files /dev/null and b/data/processed/lab039/lab039_analytic_vs_model.png differ diff --git a/data/processed/lab039/lab039_deceleration_profiles.png b/data/processed/lab039/lab039_deceleration_profiles.png new file mode 100644 index 0000000..692c906 Binary files /dev/null and b/data/processed/lab039/lab039_deceleration_profiles.png differ diff --git a/data/processed/lab039/lab039_distance_metrics.csv b/data/processed/lab039/lab039_distance_metrics.csv new file mode 100644 index 0000000..f4ab339 --- /dev/null +++ b/data/processed/lab039/lab039_distance_metrics.csv @@ -0,0 +1,181 @@ +channel_condition,policy,initial_speed_kmh,deceleration_profile,event_count,mean_speed_last_fresh_mps,p95_speed_last_fresh_mps,max_speed_last_fresh_mps,mean_speed_first_threshold_mps,p95_speed_first_threshold_mps,max_speed_first_threshold_mps,mean_speed_second_threshold_mps,p95_speed_second_threshold_mps,max_speed_second_threshold_mps,mean_distance_to_first_m,p95_distance_to_first_m,max_distance_to_first_m,mean_distance_between_m,p95_distance_between_m,max_distance_between_m,mean_distance_to_second_m,p95_distance_to_second_m,max_distance_to_second_m,mean_braking_distance_m,p95_braking_distance_m,max_braking_distance_m,mean_total_stop_path_m,p95_total_stop_path_m,max_total_stop_path_m,mean_time_to_stop_seconds,p95_time_to_stop_seconds,max_time_to_stop_seconds,mean_minimum_speed_mps,p95_minimum_speed_mps,max_minimum_speed_mps,full_stop_fraction,recovery_before_stop_fraction +no_loss,single_250,5.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,5.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,5.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,15.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,15.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,15.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,25.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,25.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,25.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,5.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,5.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,5.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,15.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,15.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,15.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,25.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,25.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,25.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,5.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,5.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,5.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,15.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,15.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,15.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,25.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,25.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,25.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,5.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,5.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,5.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,15.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,15.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,15.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,25.0,soft,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,25.0,nominal,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,25.0,intensive,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +300_50,single_250,5.0,soft,113,1.388888888888889,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,0.3472222222222259,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.3472222222222259,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.292257378564404,1.386520355555564,1.3887295555555528,0.0,1.0 +300_50,single_250,5.0,nominal,113,1.3888888888888888,1.3888888888888888,1.3888888888888888,1.3888888888888888,1.3888888888888888,1.3888888888888888,1.3888888888888888,1.3888888888888888,1.3888888888888888,0.34722222222222576,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.34722222222222576,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.2439416234021616,1.3853360888889017,1.3886498888888847,0.0,1.0 +300_50,single_250,5.0,intensive,113,1.388888888888889,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,0.3472222222222259,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.3472222222222259,0.34722222222222854,0.34722222222222854,0.24112654320987303,0.24112654320987303,0.24112654320987303,0.5883487654320945,0.5883487654320945,0.5883487654320945,0.5972222222222214,0.5972222222222214,0.5972222222222214,1.1956382969518167,1.3841518222222393,1.3885702222222167,0.008849557522123894,0.9911504424778761 +300_50,single_250,15.0,soft,113,4.166666666666666,4.166666666666667,4.166666666666667,4.166666666666666,4.166666666666667,4.166666666666667,4.166666666666666,4.166666666666667,4.166666666666667,1.0416666666666725,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0416666666666725,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.070035156342182,4.164298133333342,4.166507333333331,0.0,1.0 +300_50,single_250,15.0,nominal,113,4.166666666666665,4.166666666666667,4.166666666666667,4.166666666666665,4.166666666666667,4.166666666666667,4.166666666666665,4.166666666666667,4.166666666666667,1.0416666666666725,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0416666666666725,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.021719401179939,4.16311386666668,4.166427666666663,0.0,1.0 +300_50,single_250,15.0,intensive,113,4.166666666666666,4.166666666666667,4.166666666666667,4.166666666666666,4.166666666666667,4.166666666666667,4.166666666666666,4.166666666666667,4.166666666666667,1.0416666666666725,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0416666666666725,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.9734036460176965,4.161929600000017,4.166347999999995,0.0,1.0 +300_50,single_250,25.0,soft,113,6.944444444444444,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,1.7361111111110947,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,1.7361111111110947,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.847812934119959,6.94207591111112,6.944285111111109,0.0,1.0 +300_50,single_250,25.0,nominal,113,6.944444444444443,6.944444444444445,6.944444444444445,6.944444444444443,6.944444444444445,6.944444444444445,6.944444444444443,6.944444444444445,6.944444444444445,1.7361111111110947,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,1.7361111111110947,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.799497178957717,6.9408916444444575,6.9442054444444405,0.0,1.0 +300_50,single_250,25.0,intensive,113,6.944444444444444,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,1.7361111111110947,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,1.7361111111110947,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.751181423795474,6.939707377777795,6.9441257777777725,0.0,1.0 +300_50,two_100_200,5.0,soft,2277,1.3883654808227202,1.3888888888888888,1.3888888888888888,1.388768120772947,1.3888888888888888,1.3888888888888888,1.3696358253549956,1.3877422222222235,1.388862222222222,0.13886054891271582,0.13888888888889284,0.13888888888889284,0.05246359369459609,0.136388888888888,0.13638888888890222,0.1913241426073119,0.27527777777778084,0.27527777777778795,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.3573122337871437,1.3877422222222235,1.388862222222222,0.0,1.0 +300_50,two_100_200,5.0,nominal,2277,1.3875596189430537,1.3888888888888888,1.3888888888888888,1.3883363608549262,1.3888888888888888,1.3888888888888888,1.3500717700190237,1.3865955555555582,1.3888355555555552,0.13880274939762102,0.13888888888889284,0.13888888888889284,0.05177076770564442,0.13388888888889028,0.1338888888889045,0.19057351710326545,0.2727777777777777,0.2727777777777902,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.3315863826672456,1.3865955555555582,1.3888355555555552,0.0,1.0 +300_50,two_100_200,5.0,intensive,2277,1.3862801530278632,1.3888888888888888,1.3888888888888888,1.387654309007954,1.3888888888888888,1.3888888888888888,1.3302574227541004,1.385448888888893,1.3888088888888883,0.13870774169851907,0.13888888888889284,0.13888888888889284,0.05106484339113538,0.13138888888889255,0.13138888888889255,0.18977258508965447,0.2702777777777783,0.2702777777777854,0.19185570987654188,0.19185570987654188,0.19185570987654188,0.46213348765432727,0.46213348765432727,0.46213348765432727,0.5097222222222229,0.5097222222222229,0.5097222222222229,1.3057645674376517,1.385448888888893,1.3888088888888883,0.0004391743522178305,0.9995608256477821 +300_50,two_100_200,15.0,soft,2277,4.166143258600497,4.166666666666667,4.166666666666667,4.166545898550725,4.166666666666667,4.166666666666667,4.147413603132774,4.165520000000002,4.16664,0.41663832669048284,0.4166666666666856,0.4166666666666856,0.15875412379432557,0.4141666666666879,0.4141666666666879,0.5753924504848084,0.8308333333333309,0.8308333333333735,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.135090011564921,4.165520000000002,4.16664,0.0,1.0 +300_50,two_100_200,15.0,nominal,2277,4.165337396720831,4.166666666666667,4.166666666666667,4.166114138632703,4.166666666666667,4.166666666666667,4.127849547796801,4.164373333333336,4.166613333333333,0.41658052717538796,0.4166666666666856,0.4166666666666856,0.15806129780537476,0.41166666666669016,0.41166666666669016,0.5746418249807627,0.8283333333333331,0.8283333333333758,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.109364160445024,4.164373333333336,4.166613333333333,0.0,1.0 +300_50,two_100_200,15.0,intensive,2277,4.163903602986386,4.166666666666667,4.166666666666667,4.165277758966477,4.166666666666667,4.166666666666667,4.107880872712624,4.163226666666671,4.166586666666666,0.41647008669436064,0.4166666666666856,0.4166666666666856,0.1573416898090024,0.40916666666669244,0.40916666666669244,0.5738117765033631,0.8258333333333354,0.825833333333378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.083233689576918,4.163226666666671,4.166586666666666,0.0,1.0 +300_50,two_100_200,25.0,soft,2277,6.943921036378275,6.944444444444445,6.944444444444445,6.9443236763285014,6.944444444444445,6.944444444444445,6.925191380910551,6.943297777777779,6.944417777777778,0.6944161044682784,0.6944444444444571,0.6944444444444571,0.26504465389405196,0.6919444444445162,0.6919444444445162,0.9594607583623302,1.3863888888889164,1.3863888888889733,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.912867789342698,6.943297777777779,6.944417777777778,0.0,1.0 +300_50,two_100_200,25.0,nominal,2277,6.943115174498608,6.944444444444445,6.944444444444445,6.943891916410481,6.944444444444445,6.944444444444445,6.905627325574579,6.942151111111114,6.944391111111111,0.6943583049531834,0.6944444444444571,0.6944444444444571,0.2643518279050987,0.6894444444444616,0.6894444444445185,0.9587101328582822,1.3838888888889187,1.3838888888889187,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.8871419382228005,6.942151111111114,6.944391111111111,0.0,1.0 +300_50,two_100_200,25.0,intensive,2277,6.941681380764162,6.944444444444445,6.944444444444445,6.943055536744253,6.944444444444445,6.944444444444445,6.8856586504904005,6.941004444444449,6.944364444444444,0.6942478644721558,0.6944444444444571,0.6944444444444571,0.2636322199087285,0.6869444444445207,0.6869444444445207,0.9578800843808843,1.381388888888921,1.3813888888889778,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.861011467354697,6.941004444444449,6.944364444444444,0.0,1.0 +300_50,two_150_250,5.0,soft,842,1.3887903607812087,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,1.3698616260226968,1.3878088888888906,1.3888355555555552,0.2083301411408178,0.2083333333333428,0.2083333333333428,0.05218613029291181,0.136388888888888,0.13638888888889156,0.2605162714337296,0.3447222222222305,0.3447222222222308,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.3568932641858003,1.3878088888888906,1.3888355555555552,0.0,1.0 +300_50,two_150_250,5.0,nominal,842,1.3886471462127208,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,1.3508343631565043,1.3867288888888922,1.3887822222222215,0.20832105015183075,0.2083333333333428,0.2083333333333428,0.051518752624176975,0.13388888888889028,0.13388888888889028,0.2598398027760077,0.3422222222222189,0.3422222222222331,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.3313818204011598,1.3867288888888922,1.3887822222222215,0.0,1.0 +300_50,two_150_250,5.0,intensive,842,1.3881660151095268,1.3888888888888888,1.3888888888888888,1.3888043165742936,1.3888888888888888,1.3888888888888888,1.3317225279757166,1.385648888888894,1.3887288888888878,0.20828180162934723,0.2083333333333428,0.2083333333333428,0.05084747584211224,0.13138888888889255,0.13138888888889255,0.2591292774714595,0.33972222222222115,0.33972222222223536,0.19185570987654188,0.19185570987654188,0.19185570987654188,0.531577932098763,0.531577932098763,0.531577932098763,0.55972222222222,0.55972222222222,0.55972222222222,1.3059656195566083,1.385648888888894,1.3887288888888878,0.0011876484560570072,0.998812351543943 +300_50,two_150_250,15.0,soft,842,4.1665681385589854,4.166666666666667,4.166666666666667,4.166666666666666,4.166666666666667,4.166666666666667,4.147639403800474,4.165586666666669,4.166613333333333,0.6249968078074819,0.625,0.6250000000000036,0.1578931462162002,0.41416666666665947,0.4141666666666879,0.7828899540236823,1.0391666666666595,1.0391666666666879,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.134671041963578,4.165586666666669,4.166613333333333,0.0,1.0 +300_50,two_150_250,15.0,nominal,842,4.166424923990498,4.166666666666667,4.166666666666667,4.166666666666666,4.166666666666667,4.166666666666667,4.1286121409342815,4.164506666666671,4.16656,0.6249877168184949,0.625,0.6250000000000036,0.15722576854746706,0.41166666666666174,0.41166666666669016,0.7822134853659619,1.0366666666666617,1.0366666666666902,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.1091595981789375,4.164506666666671,4.16656,0.0,1.0 +300_50,two_150_250,15.0,intensive,842,4.165763977632619,4.166666666666667,4.166666666666667,4.166402279097387,4.166666666666667,4.166666666666667,4.10932049049881,4.163426666666672,4.166506666666666,0.6249214960078086,0.625,0.6250000000000036,0.1565475389688267,0.409166666666664,0.40916666666669244,0.7814690349766352,1.034166666666664,1.0341666666666924,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.083383766825016,4.163426666666672,4.166506666666666,0.0,1.0 +300_50,two_150_250,25.0,soft,842,6.944345916336763,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,6.925417181578252,6.9433644444444464,6.944391111111111,1.0416634744741682,1.0416666666667425,1.0416666666667425,0.26360016213949533,0.6919444444444594,0.6919444444444594,1.3052636366136634,1.7336111111111165,1.733611111111145,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.912448819741356,6.9433644444444464,6.944391111111111,0.0,1.0 +300_50,two_150_250,25.0,nominal,842,6.944202701768276,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,6.906389918712059,6.942284444444448,6.944337777777777,1.041654383485181,1.0416666666667425,1.0416666666667425,0.2629327844707617,0.6894444444444616,0.6894444444444616,1.3045871679559429,1.7311111111111188,1.731111111111204,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.886937375956715,6.942284444444448,6.944337777777777,0.0,1.0 +300_50,two_150_250,25.0,intensive,842,6.943541755410397,6.944444444444445,6.944444444444445,6.9441800568751635,6.944444444444445,6.944444444444445,6.8870982682765876,6.94120444444445,6.944284444444444,1.0415881626744947,1.0416666666667425,1.0416666666667425,0.262254554892117,0.6869444444444639,0.6869444444444639,1.3038427175666116,1.728611111111121,1.7286111111111495,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.861161544602795,6.94120444444445,6.944284444444444,0.0,1.0 +300_50,two_200_300,5.0,soft,294,1.3887842624716553,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,1.3689005719954659,1.3880856638888748,1.3888357222222214,0.2777761686147635,0.2777777777777857,0.2777777777777857,0.054811652898884955,0.136388888888888,0.13638888888889156,0.33258782151364846,0.4141666666666737,0.4141666666666737,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.3534088803854885,1.3880856638888748,1.3888357222222214,0.0,1.0 +300_50,two_200_300,5.0,nominal,294,1.3886796360544216,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,1.3489122551020425,1.387282438888861,1.388782555555554,0.2777713411257157,0.2777777777777857,0.2777777777777857,0.0541002033160372,0.13388888888888942,0.13388888888889028,0.33187154444175293,0.41166666666666174,0.41166666666666885,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.3256747176870762,1.387282438888861,1.388782555555554,0.0,1.0 +300_50,two_200_300,5.0,intensive,294,1.388494557823129,1.3888888888888888,1.3888888888888888,1.388888888888889,1.3888888888888888,1.3888888888888888,1.328923938208619,1.3864792138888469,1.3887293888888865,0.2777623438539614,0.2777777777777857,0.2777777777777857,0.0533887537331898,0.131388888888889,0.13138888888889255,0.3311510975871512,0.409166666666664,0.4091666666666711,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.2979405549886642,1.3864792138888469,1.3887293888888865,0.0,1.0 +300_50,two_200_300,15.0,soft,294,4.166562040249433,4.166666666666667,4.166666666666667,4.166666666666667,4.166666666666667,4.166666666666667,4.146678349773243,4.165863441666653,4.1666134999999995,0.8333317241703362,0.8333333333333712,0.8333333333333712,0.16585785786234594,0.41416666666663104,0.4141666666666737,0.9991895820326822,1.2475000000000023,1.2475000000000023,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.131186658163267,4.165863441666653,4.1666134999999995,0.0,1.0 +300_50,two_200_300,15.0,nominal,294,4.1664574138322,4.166666666666667,4.166666666666667,4.166666666666667,4.166666666666667,4.166666666666667,4.126690032879821,4.165060216666639,4.166560333333332,0.8333268966812885,0.8333333333333712,0.8333333333333712,0.165146408279498,0.4116666666666333,0.41166666666667595,0.9984733049607865,1.2450000000000045,1.2450000000000045,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.103452495464853,4.165060216666639,4.166560333333332,0.0,1.0 +300_50,two_200_300,15.0,intensive,294,4.166272335600906,4.166666666666667,4.166666666666667,4.166666666666667,4.166666666666667,4.166666666666667,4.1067017159863966,4.164256991666625,4.166507166666665,0.833317899409534,0.8333333333333712,0.8333333333333712,0.16443495869665148,0.4091666666666356,0.4091666666666782,0.9977528581061854,1.2425000000000068,1.2425000000000068,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4.075718332766442,4.164256991666625,4.166507166666665,0.0,1.0 +300_50,two_200_300,25.0,soft,294,6.94433981802721,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,6.9244561275510215,6.943641219444431,6.944391277777777,1.3888872797258907,1.3888888888889142,1.3888888888889142,0.27690406282581237,0.6919444444444025,0.6919444444444594,1.665791342551703,2.0808333333333167,2.080833333333345,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.908964435941043,6.943641219444431,6.944391277777777,0.0,1.0 +300_50,two_200_300,25.0,nominal,294,6.944235191609976,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,6.904467810657597,6.9428379944444165,6.94433811111111,1.3888824522368428,1.3888888888889142,1.3888888888889142,0.27619261324296385,0.6894444444444616,0.6894444444444616,1.6650750654798065,2.0783333333333474,2.0783333333333758,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.881230273242632,6.9428379944444165,6.94433811111111,0.0,1.0 +300_50,two_200_300,25.0,intensive,294,6.944050113378684,6.944444444444445,6.944444444444445,6.944444444444444,6.944444444444445,6.944444444444445,6.884479493764175,6.942034769444403,6.944284944444442,1.3888734549650883,1.3888888888889142,1.3888888888889142,0.2754811636601147,0.686944444444407,0.6869444444444639,1.6643546186252032,2.075833333333321,2.0758333333333496,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.853496110544219,6.942034769444403,6.944284944444442,0.0,1.0 +260_200,single_250,5.0,soft,468,1.383328590875899,1.3888888888888888,1.3888888888888888,1.385308890349929,1.3888888888888888,1.3888888888888888,1.385308890349929,1.3888888888888888,1.3888888888888888,0.3461086862766823,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.3461086862766823,0.34722222222222854,0.34722222222222854,0.46315071885521353,0.4822530864197532,0.4822530864197603,0.7988287491582475,0.8294753086419746,0.8294753086419888,0.9241969696969666,0.9444444444444446,0.94444444444445,0.9910565358682447,1.380910427350486,1.3884581196582846,0.04700854700854701,0.9508547008547008 +260_200,single_250,5.0,nominal,468,1.3805090343158868,1.3888888888888888,1.3888888888888888,1.384069522974664,1.3888888888888888,1.3888888888888888,1.384069522974664,1.3888888888888888,1.3888888888888888,0.3455906425065219,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.3455906425065219,0.34722222222222854,0.34722222222222854,0.31074990141292985,0.3215020576131735,0.3215020576131735,0.6482391519060329,0.6687242798354021,0.6687242798354021,0.7015882314266956,0.7129629629629637,0.712962962962969,0.840491865457681,1.3769211965812846,1.3882427350429825,0.1111111111111111,0.8867521367521367 +260_200,single_250,5.0,intensive,468,1.379328387939222,1.3888888888888888,1.3888888888888888,1.3832718504638877,1.3888888888888888,1.3888888888888888,1.3832718504638877,1.3888888888888888,1.3888888888888888,0.34534581715847934,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.34534581715847934,0.34722222222222854,0.34722222222222854,0.2354926911115136,0.2411265432098766,0.2411265432098766,0.5759331801903396,0.5883487654321016,0.5883487654321016,0.5914821557454916,0.5972222222222285,0.5972222222222356,0.7274434315143864,1.3708088888891128,1.3880273504276803,0.19230769230769232,0.8055555555555556 +260_200,single_250,15.0,soft,468,4.160174730111783,4.166666666666667,4.166666666666667,4.162155029585814,4.166666666666667,4.166666666666667,4.162155029585814,4.166666666666667,4.166666666666667,1.0403202210856577,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0403202210856577,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.7494865262985413,4.158688205128264,4.166235897436063,0.0,0.9978632478632479 +260_200,single_250,15.0,nominal,468,4.152808939349129,4.166666666666667,4.166666666666667,4.156369428007907,4.166666666666667,4.166666666666667,4.156369428007907,4.166666666666667,4.166666666666667,1.0386656187648367,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0386656187648367,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.537366673076999,4.1546989743590625,4.166020512820761,0.0,0.9978632478632479 +260_200,single_250,15.0,intensive,468,4.143932209237367,4.166666666666667,4.166666666666667,4.148409859796221,4.166666666666667,4.166666666666667,4.148409859796221,4.166666666666667,4.166666666666667,1.036563545987293,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.036563545987293,1.0416666666666856,1.0416666666666856,1.5945357338989368,2.1701388888889115,2.170138888888914,2.4355011185144235,3.211805555555594,3.2118055555555998,1.1013820512821464,1.2916666666666707,1.2916666666666714,3.327775088593134,4.148586666666891,4.1658051282054585,0.00641025641025641,0.9914529914529915 +260_200,single_250,25.0,soft,468,6.937952507889561,6.944444444444445,6.944444444444445,6.939932807363592,6.944444444444445,6.944444444444445,6.939932807363592,6.944444444444445,6.944444444444445,1.7347646655300781,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,1.7347646655300781,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.527264304076319,6.936465982906042,6.94401367521384,0.0,0.9978632478632479 +260_200,single_250,25.0,nominal,468,6.930586717126909,6.944444444444445,6.944444444444445,6.934147205785685,6.944444444444445,6.944444444444445,6.934147205785685,6.944444444444445,6.944444444444445,1.733110063209257,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,1.733110063209257,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.315144450854777,6.93247675213684,6.943798290598538,0.0,0.9978632478632479 +260_200,single_250,25.0,intensive,468,6.921709987015146,6.944444444444445,6.944444444444445,6.9261876375739995,6.944444444444445,6.944444444444445,6.9261876375739995,6.944444444444445,6.944444444444445,1.7310079904317144,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,1.7310079904317144,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.100850630999454,6.926364444444669,6.943582905983236,0.0,0.9978632478632479 +260_200,two_100_200,5.0,soft,893,1.3793984008767155,1.3888888888888888,1.3888888888888888,1.381645825767372,1.3888888888888888,1.3888888888888888,1.3402149409366368,1.3836950427350496,1.3883350427350432,0.13805836150813458,0.13888888888889284,0.13888888888889284,0.11271588421565396,0.13638888888890222,0.13638888888890222,0.25077424572378854,0.27527777777778795,0.27527777777778795,0.41693344446303227,0.4481558641975312,0.4481558641975312,0.6776667572835481,0.7234336419753191,0.7234336419753191,0.8340832820512857,0.8694444444444471,0.8694444444444471,1.080058695839445,1.3836950427350496,1.3883350427350432,0.027995520716685332,0.9686450167973124 +260_200,two_100_200,5.0,nominal,893,1.3745396602635926,1.3888888888888888,1.3888888888888888,1.3770854743350507,1.3888888888888888,1.3888888888888888,1.2942237046735803,1.378488888888913,1.3877811965811975,0.13758392741104195,0.13888888888889284,0.13888888888889284,0.11047630596394122,0.1338888888889045,0.1338888888889045,0.24806023337498317,0.2727777777777902,0.2727777777777902,0.26849341719453246,0.27687242798354106,0.27687242798354816,0.5349063198533109,0.5496502057613242,0.5496502057613384,0.6193632478632496,0.6296296296296333,0.6296296296296333,0.9417432462074513,1.378488888888913,1.3877811965811975,0.08958566629339305,0.9070548712206047 +260_200,two_100_200,5.0,intensive,893,1.3705384145251367,1.3888888888888888,1.3888888888888888,1.3737396855696333,1.3888888888888888,1.3888888888888888,1.2494470310774273,1.3732888888889252,1.3872273504273518,0.13721581849136394,0.13888888888889284,0.13888888888889284,0.10829284938111963,0.13138888888889255,0.13138888888889255,0.24550866787248357,0.2702777777777854,0.2702777777777854,0.18763774738928465,0.19185570987654899,0.19185570987654899,0.4534105756717147,0.46213348765432727,0.46213348765432727,0.5043576858326857,0.5097222222222229,0.5097222222222229,0.8327942889329102,1.3732888888889252,1.3872273504273518,0.14781634938409854,0.8488241881298992 +260_200,two_100_200,15.0,soft,893,4.15337001751515,4.166666666666667,4.166666666666667,4.155734286616716,4.166666666666667,4.166666666666667,4.114303401785981,4.161472820512828,4.166112820512821,0.4154611328314999,0.4166666666666856,0.4166666666666856,0.3426785364363736,0.4141666666666879,0.4141666666666879,0.7581396692678735,0.8308333333333451,0.8308333333333735,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.84017751394036,4.161472820512828,4.166112820512821,0.0,0.9966405375139977 +260_200,two_100_200,15.0,nominal,893,4.137071363798214,4.166666666666667,4.166666666666667,4.1399660145002555,4.166666666666667,4.166666666666667,4.0571042448387855,4.156266666666691,4.165558974358976,0.4138546796795043,0.4166666666666856,0.4166666666666856,0.33966145926524366,0.41166666666669016,0.41166666666669016,0.7535161389447481,0.8283333333333474,0.8283333333333758,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.645915413070354,4.156266666666691,4.165558974358976,0.0,0.9966405375139977 +260_200,two_100_200,15.0,intensive,893,4.118031308898299,4.166666666666667,4.166666666666667,4.122107684181837,4.166666666666667,4.166666666666667,3.997815029689632,4.151066666666703,4.16500512820513,0.41201305396243026,0.4166666666666856,0.4166666666666856,0.3364024018612716,0.40916666666669244,0.40916666666669244,0.7484154558237021,0.8258333333333496,0.825833333333378,1.7122700891716534,2.0167013888889116,2.0167013888889187,2.4444895763511703,2.84253472222224,2.84253472222224,1.0881910256410723,1.2041666666666657,1.2041666666666657,3.4542490078100796,4.151066666666703,4.16500512820513,0.006718924972004479,0.9899216125419933 +260_200,two_100_200,25.0,soft,893,6.931147795292928,6.944444444444445,6.944444444444445,6.933512064394494,6.944444444444445,6.944444444444445,6.8920811795637595,6.939250598290606,6.943890598290599,0.6932389106092949,0.6944444444444571,0.6944444444444571,0.5728501188293589,0.6919444444445162,0.6919444444445162,1.2660890294386535,1.3863888888889733,1.3863888888889733,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.617955291718138,6.939250598290606,6.943890598290599,0.0,0.9966405375139977 +260_200,two_100_200,25.0,nominal,893,6.914849141575992,6.944444444444445,6.944444444444445,6.917743792278034,6.944444444444445,6.944444444444445,6.834882022616565,6.934044444444469,6.943336752136753,0.6916324574572987,0.6944444444444571,0.6944444444444571,0.5698330416582148,0.6894444444445185,0.6894444444445185,1.2614654991155136,1.3838888888889187,1.3838888888889187,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.423693190848132,6.934044444444469,6.943336752136753,0.0,0.9966405375139977 +260_200,two_100_200,25.0,intensive,893,6.892920181631147,6.944444444444445,6.944444444444445,6.897098833883709,6.944444444444445,6.944444444444445,6.772806179391505,6.928844444444481,6.942782905982908,0.6895066118839833,0.6944444444444571,0.6944444444444571,0.5663948600620589,0.6869444444445207,0.6869444444445207,1.2559014719460424,1.3813888888889778,1.3813888888889778,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.224554403700261,6.928844444444481,6.942782905982908,0.0,0.9966405375139977 +260_200,two_150_250,5.0,soft,754,1.3827764869074421,1.3888888888888888,1.3888888888888888,1.3848438912693637,1.3888888888888888,1.3888888888888888,1.3460535548584267,1.3870235042735224,1.38882735042738,0.2075787771468138,0.2083333333333428,0.2083333333333428,0.1056529564804012,0.1363888888888889,0.13638888888890222,0.313231733627215,0.3447222222222308,0.3447222222222308,0.4307442031893001,0.4481558641975312,0.4481558641975312,0.7646759161522665,0.792878086419762,0.792878086419762,0.8988009259259284,0.9194444444444514,0.9194444444444514,1.1030465730406664,1.3870235042735224,1.38882735042738,0.03183023872679045,0.9641909814323607 +260_200,two_150_250,5.0,nominal,754,1.3787047283660891,1.3888888888888888,1.3888888888888888,1.3816178725770332,1.3888888888888888,1.3888888888888888,1.3040371997551585,1.385158119658156,1.3887658119658712,0.2070352084912672,0.2083333333333428,0.2083333333333428,0.10365509958351639,0.13388888888889028,0.1338888888889045,0.3106903080747836,0.3422222222222331,0.3422222222222331,0.2687901710618184,0.27687242798354816,0.27687242798354816,0.6029963747286375,0.619094650205767,0.619094650205767,0.6694032347140042,0.6796296296296305,0.6796296296296376,0.9749939499081842,1.385158119658156,1.3887658119658712,0.08620689655172414,0.9098143236074271 +260_200,two_150_250,5.0,intensive,754,1.3762981582216784,1.3888888888888888,1.3888888888888888,1.3797878121245102,1.3888888888888888,1.3888888888888888,1.2634168028916986,1.3832927350427893,1.3887042735043624,0.20671608813285708,0.2083333333333428,0.2083333333333428,0.10172168902603347,0.13138888888889255,0.13138888888889255,0.30843777715889054,0.33972222222223536,0.33972222222223536,0.18683806029562833,0.19185570987654899,0.19185570987654899,0.5198646663125392,0.5315779320987701,0.5315779320987701,0.5533676163342807,0.5597222222222222,0.5597222222222271,0.8755563849271164,1.3832927350427893,1.3887042735043624,0.1312997347480106,0.8647214854111406 +260_200,two_150_250,15.0,soft,754,4.158626435897447,4.166666666666667,4.166666666666667,4.160964850710751,4.166666666666667,4.166666666666667,4.122174514299814,4.1648012820513,4.166605128205158,0.6239731481690246,0.625,0.6250000000000071,0.3210384608502728,0.4141666666666737,0.4141666666666879,0.9450116090192975,1.0391666666666737,1.0391666666666879,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.8660354432939212,4.1648012820513,4.166605128205158,0.0,0.9960212201591512 +260_200,two_150_250,15.0,nominal,754,4.1454819275318,4.166666666666667,4.166666666666667,4.14906396017821,4.166666666666667,4.166666666666667,4.071483287356335,4.162882051282067,4.166543589743649,0.6220985078886404,0.625,0.6250000000000071,0.3185411399110748,0.41166666666667595,0.41166666666669016,0.9406396477997152,1.036666666666676,1.0366666666666902,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.6872746808474957,4.162882051282067,4.166543589743649,0.0,0.9960212201591512 +260_200,two_150_250,15.0,intensive,754,4.130778353125239,4.166666666666667,4.166666666666667,4.135346267700488,4.166666666666667,4.166666666666667,4.018975258467677,4.160989743589767,4.1664820512821406,0.6199663520692152,0.625,0.6250000000000284,0.3158605023007536,0.4091666666666782,0.40916666666669244,0.9358268543699687,1.0341666666666782,1.0341666666666924,1.581277115595121,2.0167013888889187,2.0167013888889187,2.4542928207233814,3.0508680555555543,3.0508680555555543,1.0958282051282744,1.2541666666666629,1.2541666666666629,3.510571808695562,4.160989743589767,4.1664820512821406,0.005305039787798408,0.9907161803713528 +260_200,two_150_250,25.0,soft,754,6.936404213675225,6.944444444444445,6.944444444444445,6.938742628488529,6.944444444444445,6.944444444444445,6.899952292077593,6.942579059829078,6.944382905982936,1.0406398148357126,1.0416666666667425,1.0416666666667425,0.5365403297999314,0.6919444444444594,0.6919444444445162,1.577180144635644,1.733611111111145,1.733611111111145,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.643813221071698,6.942579059829078,6.944382905982936,0.0,0.9960212201591512 +260_200,two_150_250,25.0,nominal,754,6.923259705309577,6.944444444444445,6.944444444444445,6.9268417379559875,6.944444444444445,6.944444444444445,6.8492610651341135,6.940659829059845,6.944321367521427,1.0387651745553281,1.0416666666667425,1.0416666666667425,0.5340430088607466,0.6894444444444616,0.6894444444445185,1.572808183416075,1.731111111111204,1.731111111111204,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.465052458625273,6.940659829059845,6.944321367521427,0.0,0.9960212201591512 +260_200,two_150_250,25.0,intensive,754,6.906296483212075,6.944444444444445,6.944444444444445,6.911051842526501,6.944444444444445,6.944444444444445,6.794680833293688,6.938767521367545,6.944259829059918,1.036307317677163,1.0416666666667425,1.0416666666667425,0.5313360988969944,0.6869444444444639,0.6869444444445207,1.5676434165741573,1.7286111111111495,1.7286111111111495,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.282402691281903,6.938767521367545,6.944259829059918,0.0,0.9960212201591512 +260_200,two_200_300,5.0,soft,586,1.3844405752749447,1.3888888888888888,1.3888888888888888,1.385941349435559,1.3888888888888888,1.3888888888888888,1.3464508888159676,1.3859965811965864,1.388673504273537,0.27706457130355644,0.2777777777777857,0.2777777777777857,0.10758764466476362,0.13638888888889156,0.13638888888890222,0.3846522159683201,0.4141666666666737,0.4141666666666737,0.4271881563474387,0.4481558641975312,0.4481558641975312,0.8262068068197808,0.8623225308642049,0.8623225308642049,0.9459521367521527,0.9694444444444485,0.9694444444444485,1.0997185764563837,1.3859965811965864,1.388673504273537,0.032423208191126277,0.9641638225255973 +260_200,two_200_300,5.0,nominal,586,1.3818491683877463,1.3888888888888888,1.3888888888888888,1.3845999649951972,1.3888888888888888,1.3888888888888888,1.3056190437560145,1.383104273504284,1.388458119658185,0.27666449248999986,0.2777777777777857,0.2777777777777857,0.1056222347259896,0.13388888888889028,0.1338888888889045,0.3822867272159895,0.41166666666666885,0.41166666666667595,0.2671381936548752,0.27687242798354816,0.27687242798354816,0.6675099096312059,0.6885390946502099,0.6885390946502099,0.717934385272849,0.7296296296296312,0.7296296296296347,0.9718405085324496,1.383104273504284,1.388458119658185,0.08873720136518772,0.9078498293515358 +260_200,two_200_300,5.0,intensive,586,1.3807265867973597,1.3888888888888888,1.3888888888888888,1.3836202013360261,1.3888888888888888,1.3888888888888888,1.2651488194772522,1.3802119658119816,1.3882427350428332,0.2764431951512881,0.2777777777777857,0.2777777777777857,0.10370737998353123,0.13138888888889255,0.13138888888889255,0.38015057513481937,0.4091666666666711,0.4091666666666782,0.18638725767614445,0.19185570987654899,0.19185570987654899,0.5866798345992185,0.601022376543213,0.601022376543213,0.6029521474358944,0.6097222222222243,0.6097222222222243,0.8738452341093212,1.3802119658119816,1.3882427350428332,0.13651877133105803,0.8600682593856656 +260_200,two_200_300,15.0,soft,586,4.160456776669306,4.166666666666667,4.166666666666667,4.16247690557453,4.166666666666667,4.166666666666667,4.122986444954938,4.163639743589778,4.16637435897439,0.8323112307189604,0.8333333333333712,0.8333333333333712,0.32693487990664855,0.4141666666666737,0.4141666666666879,1.159246110625609,1.2475000000000023,1.2475000000000023,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.8632103730200975,4.163639743589778,4.16637435897439,0.0,0.9965870307167235 +260_200,two_200_300,15.0,nominal,586,4.151254640806877,4.166666666666667,4.166666666666667,4.154524792158938,4.166666666666667,4.166666666666667,4.075543870919755,4.160374358974432,4.166082051282113,0.8305890061103578,0.8333333333333712,0.8333333333333712,0.324673805546636,0.41166666666667595,0.41166666666669016,1.1552628116569938,1.2450000000000045,1.2450000000000045,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.6858797630174926,4.160374358974432,4.166082051282113,0.0,0.9965870307167235 +260_200,two_200_300,15.0,intensive,586,4.140923530279193,4.166666666666667,4.166666666666667,4.1446777964907975,4.166666666666667,4.166666666666667,4.026206414632023,4.157228205128315,4.165789743589836,0.8285601326770192,0.8333333333333712,0.8333333333333712,0.3222376360795623,0.4091666666666782,0.40916666666669244,1.1507977687565818,1.2425000000000068,1.2425000000000068,1.4696409262066272,2.016701388888916,2.0167013888889187,2.477132721078533,3.2592013888889197,3.2592013888889255,1.1138820512821443,1.3041666666666665,1.3041666666666671,3.5101536669293063,4.157228205128315,4.165789743589836,0.005119453924914676,0.9914675767918089 +260_200,two_200_300,25.0,soft,586,6.938234554447082,6.944444444444445,6.944444444444445,6.940254683352306,6.944444444444445,6.944444444444445,6.9007642227327155,6.941417521367556,6.944152136752168,1.3878667862745138,1.3888888888889142,1.3888888888889142,0.546326327793272,0.6919444444444594,0.6919444444445162,1.9341931140677857,2.080833333333345,2.0808333333333735,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.640988150797874,6.941417521367556,6.944152136752168,0.0,0.9965870307167235 +260_200,two_200_300,25.0,nominal,586,6.9290324185846535,6.944444444444445,6.944444444444445,6.932302569936715,6.944444444444445,6.944444444444445,6.8533216486975315,6.93815213675221,6.943859829059891,1.386144561665911,1.3888888888889142,1.3888888888889142,0.5440652534332726,0.6894444444444616,0.6894444444445185,1.9302098150991838,2.0783333333333758,2.0783333333333758,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.4636575407952686,6.93815213675221,6.943859829059891,0.0,0.9965870307167235 +260_200,two_200_300,25.0,intensive,586,6.91870130805697,6.944444444444445,6.944444444444445,6.922455574268573,6.944444444444445,6.944444444444445,6.8039841924098,6.935005982906093,6.943567521367614,1.3841156882325727,1.3888888888889142,1.3888888888889142,0.5416290839661865,0.6869444444444639,0.6869444444445207,1.9257447721987593,2.0758333333333496,2.075833333333378,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.284432048540117,6.935005982906093,6.943567521367614,0.0,0.9965870307167235 +230_200,single_250,5.0,soft,463,1.3838735822873292,1.3888888888888888,1.3888888888888888,1.3867153890297466,1.3888888888888888,1.3888888888888888,1.3867153890297466,1.3888888888888888,1.3888888888888888,0.3463537562032076,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.3463537562032076,0.34722222222222854,0.34722222222222854,0.4699418283768949,0.4822530864197532,0.4822530864197532,0.8103861158165095,0.8294753086419746,0.8294753086419746,0.9340135748792203,0.9444444444444446,0.9444444444444446,0.9829751985058052,1.374579323671494,1.3887149758453776,0.04319654427645788,0.9568034557235421 +230_200,single_250,5.0,nominal,463,1.3792361056332871,1.3888888888888888,1.3888888888888888,1.3835796162393952,1.3888888888888888,1.3888888888888888,1.3835796162393952,1.3888888888888888,1.3888888888888888,0.3453775711979115,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.3453775711979115,0.34722222222222854,0.34722222222222854,0.31212163168820134,0.3215020576131735,0.3215020576131735,0.6513190118442785,0.6687242798354021,0.6687242798354021,0.7038657376439954,0.7129629629629637,0.7129629629629637,0.8264722571758769,1.3674245410627968,1.388628019323622,0.11231101511879049,0.8876889848812095 +230_200,single_250,5.0,intensive,463,1.3761552821861196,1.3888888888888888,1.3888888888888888,1.3810206821715123,1.3888888888888888,1.3888888888888888,1.3810206821715123,1.3888888888888888,1.3888888888888888,0.34469222418924733,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.34469222418924733,0.34722222222222854,0.34722222222222854,0.23527399742709953,0.2411265432098766,0.2411265432098766,0.575181146443294,0.5883487654321016,0.5883487654321016,0.5913444234404557,0.5972222222222285,0.5972222222222285,0.7035373504031943,1.3602697584540993,1.3885410628018664,0.19870410367170627,0.8012958963282938 +230_200,single_250,15.0,soft,463,4.161651360065106,4.166666666666667,4.166666666666667,4.164493166807523,4.166666666666667,4.166666666666667,4.164493166807523,4.166666666666667,4.166666666666667,1.0407982006476557,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0407982006476557,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.7380755876920495,4.152357101449272,4.166492753623156,0.0,1.0 +230_200,single_250,15.0,nominal,463,4.1548957085172304,4.166666666666667,4.166666666666667,4.160169292891351,4.166666666666667,4.166666666666667,4.160169292891351,4.166666666666667,4.166666666666667,1.0393951987927903,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0393951987927903,1.0416666666666856,1.0416666666666856,2.893518518518519,2.893518518518532,2.8935185185185333,3.9351851851851762,3.935185185185189,3.9351851851851904,1.6388888888888857,1.6388888888888857,1.6388888888888857,3.5238461952608082,4.145202318840575,4.1664057971014,0.004319654427645789,0.9956803455723542 +230_200,single_250,15.0,intensive,463,4.147966381819887,4.166666666666667,4.166666666666667,4.1543018123767474,4.166666666666667,4.166666666666667,4.1543018123767474,4.166666666666667,4.166666666666667,1.037815220572014,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.037815220572014,1.0416666666666856,1.0416666666666856,2.170138888888893,2.1701388888889097,2.170138888888914,3.211805555555559,3.211805555555592,3.2118055555555998,1.2916666666666665,1.2916666666666705,1.2916666666666714,3.3148842770837965,4.137783188405631,4.1663188405796445,0.008639308855291577,0.9913606911447084 +230_200,single_250,25.0,soft,463,6.939429137842884,6.944444444444445,6.944444444444445,6.942270944585301,6.944444444444445,6.944444444444445,6.942270944585301,6.944444444444445,6.944444444444445,1.7352426450920766,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,1.7352426450920766,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.515853365469828,6.93013487922705,6.944270531400933,0.0,1.0 +230_200,single_250,25.0,nominal,463,6.930733936415519,6.944444444444445,6.944444444444445,6.936007520789638,6.944444444444445,6.944444444444445,6.936007520789638,6.944444444444445,6.944444444444445,1.7333547557673386,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,1.7333547557673386,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.296381152116427,6.922980096618352,6.944183574879178,0.0,1.0 +230_200,single_250,25.0,intensive,463,6.92015833307248,6.944444444444445,6.944444444444445,6.92649376362934,6.944444444444445,6.944444444444445,6.92649376362934,6.944444444444445,6.944444444444445,1.7308632083851387,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,1.7308632083851387,1.7361111111111143,1.7361111111111427,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.07365860539839,6.915560966183409,6.944096618357422,0.0,1.0 +230_200,two_100_200,5.0,soft,962,1.380447794952142,1.3888888888888888,1.3888888888888888,1.3822839896752932,1.3888888888888888,1.3888888888888888,1.3423377363986015,1.385825410628017,1.3888541062801933,0.13814121206156238,0.13888888888889284,0.13888888888889284,0.10860330047852315,0.13638888888890222,0.13638888888890222,0.2467445125400855,0.27527777777778795,0.27527777777778795,0.43287141170910287,0.4481558641975312,0.4481558641975312,0.7016949739859344,0.7234336419753191,0.7234336419753191,0.8538523839529455,0.8694444444444471,0.8694444444444471,1.0978168730603362,1.385825410628017,1.3888541062801933,0.02390852390852391,0.975051975051975 +230_200,two_100_200,5.0,nominal,962,1.3731412255064421,1.3888888888888888,1.3888888888888888,1.3764581759016532,1.3888888888888888,1.3888888888888888,1.29656566934827,1.3827619323671452,1.3888193236714979,0.13748971878531097,0.13888888888889284,0.13888888888889284,0.10627274555333256,0.1338888888889045,0.1338888888889045,0.2437624643386435,0.2727777777777902,0.2727777777777902,0.26560879572093793,0.27687242798354106,0.27687242798354816,0.5303238165666804,0.5496502057613242,0.5496502057613384,0.6166483224141358,0.6296296296296333,0.6296296296296333,0.9644847148151333,1.3827619323671452,1.3888193236714979,0.07588357588357589,0.9230769230769231 +230_200,two_100_200,5.0,intensive,962,1.3665171010475348,1.3888888888888888,1.3888888888888888,1.3709562606084333,1.3888888888888888,1.3888888888888888,1.2511248405596112,1.3775567149758143,1.3887845410628024,0.13688200403286768,0.13888888888889284,0.13888888888889284,0.10395293665611088,0.13138888888889255,0.13138888888889255,0.2408349406889786,0.2702777777777854,0.2702777777777854,0.18117455958973294,0.19185570987654899,0.19185570987654899,0.440287161468805,0.46213348765432727,0.46213348765432727,0.49610585610502594,0.5097222222222229,0.5097222222222229,0.859161139735039,1.3775567149758143,1.3887845410628024,0.13617463617463618,0.8627858627858628 +230_200,two_100_200,15.0,soft,962,4.1575106511193445,4.166666666666667,4.166666666666667,4.159411509837595,4.166666666666667,4.166666666666667,4.119465256560903,4.163603188405795,4.1666318840579715,0.41584950894718986,0.4166666666666856,0.4166666666666856,0.3305070488736812,0.4141666666666879,0.4141666666666879,0.746356557820871,0.8308333333333451,0.8308333333333735,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.860410388984281,4.163603188405795,4.1666318840579715,0.0,0.998960498960499 +230_200,two_100_200,15.0,nominal,962,4.145687269878572,4.166666666666667,4.166666666666667,4.149172834372831,4.166666666666667,4.166666666666667,4.069280327819449,4.160539710144923,4.166597101449276,0.41475153199662895,0.4166666666666856,0.4166666666666856,0.32786416071686775,0.41166666666669016,0.41166666666669016,0.7426156927134967,0.8283333333333474,0.8283333333333758,2.756296296296289,2.756296296296297,2.7562962962962985,3.5846296296296294,3.5846296296296316,3.5846296296296316,1.5555555555555565,1.5555555555555571,1.5555555555555571,3.683056084847358,4.160539710144923,4.166597101449276,0.0031185031185031187,0.9958419958419958 +230_200,two_100_200,15.0,intensive,962,4.131165145078184,4.166666666666667,4.166666666666667,4.1360402603272135,4.166666666666667,4.166666666666667,4.0162015004971385,4.155131014492724,4.1665623188405805,0.41336883182168865,0.4166666666666856,0.4166666666666856,0.32502259842690034,0.40916666666669244,0.40916666666669244,0.7383914302485889,0.8258333333333496,0.825833333333378,2.0167013888888863,2.0167013888888903,2.0167013888888903,2.8420072908206566,2.84253472222224,2.84253472222224,1.2041666666666657,1.2041666666666657,1.2041666666666657,3.5062870770435577,4.155131014492724,4.1665623188405805,0.007276507276507277,0.9916839916839917 +230_200,two_100_200,25.0,soft,962,6.935288428897122,6.944444444444445,6.944444444444445,6.9371892876153725,6.944444444444445,6.944444444444445,6.897243034338683,6.941380966183573,6.944409661835749,0.6936272867249852,0.6944444444444571,0.6944444444444571,0.5524306781886457,0.6919444444445162,0.6919444444445162,1.2460579649136307,1.3863888888889733,1.3863888888889733,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.63818816676206,6.941380966183573,6.944409661835749,0.0,0.998960498960499 +230_200,two_100_200,25.0,nominal,962,6.922271688410815,6.944444444444445,6.944444444444445,6.9257572529050755,6.944444444444445,6.944444444444445,6.845864746351692,6.938317487922701,6.944374879227054,0.6924099738498699,0.6944444444444571,0.6944444444444571,0.5496684541072642,0.6894444444445185,0.6894444444445185,1.2420784279571344,1.3838888888889187,1.3838888888889187,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.457282444986758,6.938317487922701,6.944374879227054,0.0,0.998960498960499 +230_200,two_100_200,25.0,intensive,962,6.904363714885448,6.944444444444445,6.944444444444445,6.909342780238428,6.944444444444445,6.944444444444445,6.789504020408354,6.932908792270502,6.944340096618358,0.6906938863076288,0.6944444444444571,0.6944444444444571,0.5465013447862125,0.6869444444445207,0.6869444444445207,1.2371952310938414,1.3813888888889778,1.3813888888889778,5.7705594135802585,5.7705594135802585,5.7705594135802585,7.1519483024691795,7.1519483024691795,7.1519483024691795,1.8986111111111157,1.8986111111111157,1.8986111111111157,6.2715590044893945,6.932908792270502,6.944340096618358,0.0010395010395010396,0.997920997920998 +230_200,two_150_250,5.0,soft,771,1.3820840391736675,1.3888888888888888,1.3888888888888888,1.3841478524032398,1.3888888888888888,1.3888888888888888,1.3452226846369326,1.3858019323671509,1.3888801932367119,0.20748521789540297,0.2083333333333428,0.2083333333333428,0.10604066115309638,0.1363888888888889,0.13638888888889156,0.3135258790484994,0.3447222222222308,0.3447222222222308,0.4331911967343885,0.4481558641975312,0.4481558641975312,0.7702604841740005,0.792878086419762,0.792878086419762,0.9052635748792242,0.9194444444444514,0.9194444444444514,1.104260676579105,1.3858019323671509,1.3888801932367119,0.02594033722438392,0.9727626459143969 +230_200,two_150_250,5.0,nominal,771,1.3765493712287813,1.3888888888888888,1.3888888888888888,1.3799964410358585,1.3888888888888888,1.3888888888888888,1.3021461055032435,1.382714975845413,1.3888714975845349,0.2067571906239473,0.2083333333333428,0.2083333333333428,0.10392613138777097,0.13388888888889028,0.13388888888889028,0.3106833220117183,0.3422222222222331,0.3422222222222331,0.26846017094624874,0.27687242798354816,0.27687242798354816,0.6028842589022702,0.619094650205767,0.619094650205767,0.6697493586540051,0.6796296296296305,0.6796296296296305,0.9751589215335787,1.382714975845413,1.3888714975845349,0.07522697795071336,0.9234760051880675 +230_200,two_150_250,5.0,intensive,771,1.371587078704486,1.3888888888888888,1.3888888888888888,1.3763115071085286,1.3888888888888888,1.3888888888888888,1.2595360038096062,1.379628019323673,1.388862801932358,0.20610502501331004,0.2083333333333428,0.2083333333333428,0.10189144634865628,0.13138888888889255,0.13138888888889255,0.30799647136196634,0.33972222222223536,0.33972222222223536,0.18561946992727607,0.19185570987654899,0.19185570987654899,0.5172203308829381,0.5315779320987701,0.5315779320987701,0.5522691777873417,0.5597222222222218,0.5597222222222236,0.8725101198643752,1.379628019323673,1.388862801932358,0.1309987029831388,0.867704280155642 +230_200,two_150_250,15.0,soft,771,4.159861816951445,4.166666666666667,4.166666666666667,4.161925630181017,4.166666666666667,4.166666666666667,4.12300046241471,4.163579710144929,4.16665797101449,0.6241518845620669,0.625,0.6250000000000002,0.3222915931881319,0.4141666666666737,0.4141666666666879,0.9464434777501988,1.0391666666666737,1.0391666666666879,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.8669286866294126,4.163579710144929,4.16665797101449,0.0,0.9987029831387808 +230_200,two_150_250,15.0,nominal,771,4.151684918889451,4.166666666666667,4.166666666666667,4.155459170285154,4.166666666666667,4.166666666666667,4.077608834752539,4.160492753623191,4.166649275362313,0.6230477673870628,0.625,0.6250000000000002,0.3200102213922261,0.41166666666667595,0.41166666666669016,0.943057988779289,1.036666666666676,1.0366666666666902,2.756296296296289,2.756296296296297,2.7562962962962985,3.792962962962953,3.792962962962965,3.7929629629629673,1.605555555555555,1.6055555555555558,1.605555555555556,3.6958597342054818,4.160492753623191,4.166649275362313,0.0038910505836575876,0.9948119325551232 +230_200,two_150_250,15.0,intensive,771,4.1416131092689685,4.166666666666667,4.166666666666667,4.146614564183535,4.166666666666667,4.166666666666667,4.029839060884612,4.15740579710145,4.166640579710136,0.6216248321150202,0.625,0.6250000000000002,0.3175946239921458,0.4091666666666782,0.40916666666669244,0.9392194561071661,1.0341666666666782,1.0341666666666924,2.016701388888896,2.016701388888913,2.0167013888889187,3.0508680555555543,3.0508680555555543,3.0508680555555543,1.2541666666666642,1.2541666666666664,1.2541666666666664,3.526537698076968,4.15740579710145,4.166640579710136,0.00648508430609598,0.9922178988326849 +230_200,two_150_250,25.0,soft,771,6.937639594729222,6.944444444444445,6.944444444444445,6.939703407958795,6.944444444444445,6.944444444444445,6.900778240192487,6.941357487922707,6.944435748792268,1.0408185512287558,1.0416666666667425,1.0416666666667425,0.5385425252231796,0.6919444444444594,0.6919444444444594,1.579361076451935,1.733611111111145,1.733611111111145,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.64470646440719,6.941357487922707,6.944435748792268,0.0,0.9987029831387808 +230_200,two_150_250,25.0,nominal,771,6.928168258801854,6.944444444444445,6.944444444444445,6.931942510197558,6.944444444444445,6.944444444444445,6.854092174664942,6.938270531400969,6.944427053140091,1.0395202683739455,1.0416666666667425,1.0416666666667425,0.536131709640751,0.6894444444444616,0.6894444444444616,1.5756519780146963,1.731111111111204,1.731111111111204,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.469984510986996,6.938270531400969,6.944427053140091,0.0,0.9987029831387808 +230_200,two_150_250,25.0,intensive,771,6.914038049587393,6.944444444444445,6.944444444444445,6.919234057031142,6.944444444444445,6.944444444444445,6.802458553732221,6.935183574879229,6.944418357487914,1.0375031646024946,1.0416666666667425,1.0416666666667425,0.5333571282717834,0.6869444444444639,0.6869444444444639,1.5708602928742779,1.7286111111111495,1.7286111111111495,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.290315002161625,6.935183574879229,6.944418357487914,0.0,0.9987029831387808 +230_200,two_200_300,5.0,soft,599,1.3855709531989706,1.3888888888888888,1.3888888888888888,1.3872088714685504,1.3888888888888888,1.3888888888888888,1.3484494318227693,1.387184541062783,1.3888367149758483,0.2772855870185115,0.2777777777777857,0.2777777777777857,0.10571754987760659,0.13638888888889156,0.13638888888889156,0.3830031368961181,0.4141666666666737,0.4141666666666737,0.4481558641975312,0.4481558641975312,0.4481558641975312,0.8623225308641987,0.8623225308642049,0.8623225308642049,0.969444444444445,0.9694444444444485,0.9694444444444485,1.1033768648229787,1.387184541062783,1.3888367149758483,0.028380634390651086,0.9699499165275459 +230_200,two_200_300,5.0,nominal,599,1.3815071883090164,1.3888888888888888,1.3888888888888888,1.3845306364068928,1.3888888888888888,1.3888888888888888,1.307011757115331,1.3854801932366771,1.3887845410628077,0.27661824474913055,0.2777777777777857,0.2777777777777857,0.10369879407861297,0.13388888888889028,0.13388888888889028,0.3803170388277436,0.41166666666666885,0.41166666666667595,0.2680332822676144,0.27687242798354816,0.27687242798354816,0.6702734755043244,0.6885390946502099,0.6885390946502099,0.7200272299580022,0.7296296296296312,0.7296296296296312,0.9751048526932559,1.3854801932366771,1.3887845410628077,0.08514190317195326,0.9131886477462438 +230_200,two_200_300,5.0,intensive,599,1.3785711290153464,1.3888888888888888,1.3888888888888888,1.381809224714297,1.3888888888888888,1.3888888888888888,1.2655309057769544,1.3837758454105713,1.388732367149767,0.2760532079193517,0.2777777777777857,0.2777777777777857,0.10168459950182288,0.13138888888889255,0.13138888888889255,0.3777378074211745,0.40916666666666757,0.4091666666666711,0.18596065703411208,0.19185570987654899,0.19185570987654899,0.5855586647391154,0.601022376543213,0.601022376543213,0.6025922216107098,0.6097222222222243,0.6097222222222243,0.8718111506294256,1.3837758454105713,1.388732367149767,0.1318864774624374,0.8664440734557596 +230_200,two_200_300,15.0,soft,599,4.163348730976748,4.166666666666667,4.166666666666667,4.1649866492463286,4.166666666666667,4.166666666666667,4.126227209600548,4.164962318840561,4.166614492753626,0.8328411425740856,0.8333333333333712,0.8333333333333712,0.32104777013193725,0.4141666666666737,0.4141666666666737,1.1538889127060228,1.2475000000000023,1.2475000000000023,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,3.86522025598215,4.164962318840561,4.166614492753626,0.0,0.998330550918197 +230_200,two_200_300,15.0,nominal,599,4.15781465727904,4.166666666666667,4.166666666666667,4.1613900655682174,4.166666666666667,4.166666666666667,4.083871186276656,4.163257971014455,4.166562318840586,0.8319273701539732,0.8333333333333712,0.8333333333333712,0.3189371794713023,0.41166666666667595,0.41166666666667595,1.1508645496252756,1.2450000000000045,1.2450000000000045,2.7562962962963127,2.7562962962963127,2.7562962962963127,4.001296296296289,4.001296296296289,4.001296296296289,1.6555555555555515,1.6555555555555515,1.6555555555555515,3.6947470905615076,4.163257971014455,4.166562318840586,0.00333889816360601,0.994991652754591 +230_200,two_200_300,15.0,intensive,599,4.151944758171831,4.166666666666667,4.166666666666667,4.156068703878444,4.166666666666667,4.166666666666667,4.039790384941101,4.161553623188349,4.166510144927545,0.8308089543431224,0.8333333333333712,0.8333333333333712,0.3167008542608546,0.4091666666666782,0.4091666666666782,1.1475098086039772,1.2425000000000068,1.2425000000000068,2.0167013888888903,2.0167013888888903,2.0167013888888903,3.259201388888876,3.2592013888888878,3.25920138888889,1.3041666666666671,1.3041666666666671,1.3041666666666671,3.5278620696328886,4.161553623188349,4.166510144927545,0.005008347245409015,0.993322203672788 +230_200,two_200_300,25.0,soft,599,6.941126508754526,6.944444444444445,6.944444444444445,6.942764427024106,6.944444444444445,6.944444444444445,6.904004987378324,6.942740096618339,6.944392270531404,1.388396698129639,1.3888888888889142,1.3888888888889142,0.5363779903862804,0.6919444444444594,0.6919444444444594,1.9247746885159194,2.080833333333345,2.080833333333345,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.642998033759927,6.942740096618339,6.944392270531404,0.0,0.998330550918197 +230_200,two_200_300,25.0,nominal,599,6.934176722879514,6.944444444444445,6.944444444444445,6.937752131168693,6.944444444444445,6.944444444444445,6.860233251877131,6.941035748792233,6.9443400966183635,1.3871997832740666,1.3888888888889142,1.3888888888889142,0.5341258285079296,0.6894444444444616,0.6894444444444616,1.9213256117819963,2.0783333333333758,2.0783333333333758,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.468722821449535,6.941035748792233,6.9443400966183635,0.0,0.998330550918197 +230_200,two_200_300,25.0,intensive,599,6.923500436314949,6.944444444444445,6.944444444444445,6.927958271837922,6.944444444444445,6.944444444444445,6.81167995290058,6.939331400966127,6.944287922705323,1.3851534789533806,1.3888888888889142,1.3888888888889142,0.5315531207236125,0.6869444444444639,0.6869444444444639,1.9167065996769932,2.0758333333333496,2.0758333333333496,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,6.289666045663784,6.939331400966127,6.944287922705323,0.0,0.998330550918197 +230_1000,single_250,5.0,soft,207,1.3724854815748335,1.3888888888888888,1.3888888888888888,1.378743167868561,1.3888888888888888,1.3888888888888888,1.378743167868561,1.3888888888888888,1.3888888888888888,0.3439259953198591,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.3439259953198591,0.34722222222222854,0.34722222222222854,0.4776768861115074,0.4822530864197532,0.4822530864197603,0.8223001645049943,0.8294753086419746,0.8294753086419888,0.9404720469830434,0.9444444444444446,0.9444444444444446,0.3588959835703238,1.1799567149757608,1.3820367149757433,0.4927536231884058,0.4975845410628019 +230_1000,single_250,5.0,nominal,207,1.3712565800835494,1.3888888888888888,1.3888888888888888,1.3775142663772775,1.3888888888888888,1.3888888888888888,1.3775142663772775,1.3888888888888888,1.3888888888888888,0.34361876994703816,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.34361876994703816,0.34722222222222854,0.34722222222222854,0.3180271803179197,0.3215020576131735,0.3215020576131735,0.6623059998776091,0.6687242798354021,0.6687242798354021,0.7099926245528622,0.712962962962963,0.7129629629629655,0.2296820182502099,1.075490628019197,1.3786106280191706,0.6328502415458938,0.36231884057971014 +230_1000,single_250,5.0,intensive,207,1.3692046582183937,1.3888888888888888,1.3888888888888888,1.3762853648859938,1.3888888888888888,1.3888888888888888,1.3762853648859938,1.3888888888888888,1.3888888888888888,0.343241437551761,0.34722222222222854,0.34722222222222854,0.0,0.0,0.0,0.343241437551761,0.34722222222222854,0.34722222222222854,0.2385019169849753,0.2411265432098766,0.2411265432098766,0.5826735237163153,0.5883487654321016,0.5883487654321016,0.5948838577421841,0.5972222222222285,0.5972222222222285,0.16166930383451694,0.9710245410626328,1.3751845410625978,0.7342995169082126,0.2608695652173913 +230_1000,single_250,15.0,soft,207,4.086817279283066,4.166666666666667,4.166666666666667,4.098894573969057,4.166666666666667,4.166666666666667,4.098894573969057,4.166666666666667,4.166666666666667,1.0232139816565227,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0232139816565227,1.0416666666666856,1.0416666666666856,4.052152116724752,4.340277777777779,4.340277777777786,5.046971004055289,5.381944444444457,5.381944444444457,2.247702290790094,2.3333333333333357,2.3333333333333357,2.2927411888260014,3.957734492753539,4.159814492753521,0.1497584541062802,0.8357487922705314 +230_1000,single_250,15.0,nominal,207,4.0658827977315735,4.166666666666667,4.166666666666667,4.077960092417563,4.166666666666667,4.166666666666667,4.077960092417563,4.166666666666667,4.166666666666667,1.0179803612686495,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.0179803612686495,1.0416666666666856,1.0416666666666856,2.7670296297307675,2.8935185185185333,2.8935185185185333,3.7761954423601787,3.935185185185219,3.935185185185219,1.598530607315391,1.6388888888888893,1.6388888888888893,1.7818815654976756,3.853268405796975,4.156388405796949,0.27053140096618356,0.714975845410628 +230_1000,single_250,15.0,intensive,207,4.051722775327312,4.166666666666667,4.166666666666667,4.066113365539456,4.166666666666667,4.166666666666667,4.066113365539456,4.166666666666667,4.166666666666667,1.014789343724533,1.0416666666666856,1.0416666666666856,0.0,0.0,0.0,1.014789343724533,1.0416666666666856,1.0416666666666856,2.0659811888264135,2.170138888888914,2.170138888888914,3.0719853935142036,3.2118055555555998,3.2118055555555998,1.2583190195025986,1.2916666666666714,1.2916666666666714,1.439227977316039,3.748802318840411,4.152962318840376,0.391304347826087,0.5942028985507246 +230_1000,single_250,25.0,soft,207,6.830749879810491,6.944444444444445,6.944444444444445,6.842827174496482,6.944444444444445,6.944444444444445,6.842827174496482,6.944444444444445,6.944444444444445,1.709197131788354,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,1.709197131788354,1.7361111111111143,1.7361111111111143,10.610217522100562,12.05632716049386,12.056327160493879,12.206108524515997,13.792438271604954,13.792438271604965,3.457407004830901,3.722222222222226,3.7222222222222285,4.803812812434454,6.735512270531316,6.937592270531299,0.03864734299516908,0.9468599033816425 +230_1000,single_250,25.0,nominal,207,6.776690256482066,6.944444444444445,6.944444444444445,6.788767551168056,6.944444444444445,6.944444444444445,6.788767551168056,6.944444444444445,6.944444444444445,1.6956822259562483,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,1.6956822259562483,1.7361111111111143,1.7361111111111143,7.222003975933089,8.037551440329253,8.037551440329253,8.833932616374762,9.773662551440339,9.773662551440339,2.4051905682079604,2.5648148148148167,2.5648148148148167,4.009368480011386,6.631046183574752,6.934166183574726,0.13526570048309178,0.8502415458937198 +230_1000,single_250,25.0,intensive,207,6.744055086466428,6.944444444444445,6.944444444444445,6.758445676678572,6.944444444444445,6.944444444444445,6.758445676678572,6.944444444444445,6.944444444444445,1.6878724215092884,1.7361111111111143,1.7361111111111143,0.0,0.0,0.0,1.6878724215092884,1.7361111111111143,1.7361111111111143,5.470568704426801,6.0281635802469395,6.0281635802469395,7.0867966282555725,7.764274691358025,7.764274691358025,1.8698616447590215,1.9861111111111143,1.9861111111111143,3.4055366519641526,6.526580096618189,6.930740096618154,0.20772946859903382,0.7777777777777778 +230_1000,two_100_200,5.0,soft,236,1.3738655612871538,1.3888888888888888,1.3888888888888888,1.3761763285024153,1.3888888888888888,1.3888888888888888,1.3287141324818128,1.3641758454106223,1.3884888888888827,0.137507345113003,0.13888888888889284,0.13888888888889284,0.12823703748712198,0.13638888888890222,0.13638888888890222,0.26574438260012495,0.27527777777778795,0.27527777777778795,0.4408439421152163,0.4481558641975312,0.4481558641975312,0.7132345191903162,0.7234336419753191,0.7234336419753191,0.8625673517786538,0.8694444444444471,0.8694444444444471,0.41482872349149863,1.3641758454106223,1.3884888888888827,0.4661016949152542,0.5169491525423728 +230_1000,two_100_200,5.0,nominal,236,1.3714417587816259,1.3888888888888888,1.3888888888888888,1.3741762548104468,1.3888888888888888,1.3888888888888888,1.2792518627692424,1.3394628019323558,1.3880888888888765,0.13728615130312816,0.13888888888889284,0.13888888888889284,0.12570589025313805,0.1338888888889045,0.1338888888889045,0.2629920415562662,0.2727777777777902,0.2727777777777902,0.27243801656878996,0.27687242798354106,0.27687242798354106,0.5423399629289455,0.5496502057613242,0.5496502057613242,0.6250664623243956,0.6296296296296333,0.6296296296296333,0.2910178989602675,1.3394628019323558,1.3880888888888765,0.614406779661017,0.3728813559322034 +230_1000,two_100_200,5.0,intensive,236,1.3686573814787513,1.3888888888888888,1.3888888888888888,1.371391877507572,1.3888888888888888,1.3888888888888888,1.2290052894457653,1.3147497584540893,1.3876888888888703,0.13700771357284072,0.13888888888889284,0.13888888888889284,0.12309631265806012,0.13138888888889255,0.13138888888889255,0.26010402623090084,0.2702777777777854,0.2702777777777854,0.18662966396445485,0.19185570987654899,0.19185570987654899,0.4518130433065305,0.46213348765432727,0.46213348765432727,0.5035774384633078,0.5097222222222229,0.5097222222222229,0.227621632686694,1.3147497584540893,1.3876888888888703,0.711864406779661,0.2754237288135593 +230_1000,two_100_200,15.0,soft,236,4.092815720953085,4.166666666666667,4.166666666666667,4.097053009088677,4.166666666666667,4.166666666666667,4.049590813068075,4.1419536231884,4.166266666666661,0.4094934365020759,0.4166666666666856,0.4166666666666856,0.3862257945490893,0.4141666666666879,0.4141666666666879,0.7957192310511653,0.8308333333333451,0.8308333333333735,3.915341749730826,4.236736111111114,4.236736111111114,4.705471053143637,5.067569444444445,5.067569444444448,2.1581861617578397,2.25833333333334,2.25833333333334,2.4006394743307746,4.1419536231884,4.166266666666661,0.13135593220338984,0.847457627118644 +230_1000,two_100_200,15.0,nominal,236,4.072829378531075,4.166666666666667,4.166666666666667,4.077768803733728,4.166666666666667,4.166666666666667,3.982844411692524,4.117240579710134,4.165866666666655,0.4075346832095401,0.4166666666666856,0.4166666666666856,0.381966234148807,0.41166666666669016,0.41166666666669016,0.7895009173583472,0.8283333333333474,0.8283333333333758,2.633322133880217,2.7562962962962985,2.7562962962962985,3.436310577691097,3.5846296296296316,3.5846296296296316,1.513860521105572,1.5555555555555571,1.5555555555555571,1.9020369442400271,4.117240579710134,4.165866666666655,0.2584745762711864,0.7203389830508474 +230_1000,two_100_200,15.0,intensive,236,4.055446352247603,4.166666666666667,4.166666666666667,4.061378555637433,4.166666666666667,4.166666666666667,3.918991967575628,4.092527536231867,4.165466666666648,0.4058412453942396,0.4166666666666856,0.4166666666666856,0.37799606947439063,0.40916666666669244,0.40916666666669244,0.7838373148686303,0.8258333333333496,0.825833333333378,1.8769313196115756,2.0167013888888903,2.0167013888888903,2.6603070995710585,2.84253472222224,2.84253472222224,1.1516995636590313,1.2041666666666662,1.2041666666666666,1.5711277327442197,4.092527536231867,4.165466666666648,0.3940677966101695,0.5847457627118644 +230_1000,two_100_200,25.0,soft,236,6.834378113485626,6.944444444444445,6.944444444444445,6.839039130434779,6.944444444444445,6.944444444444445,6.791576934414176,6.919587922705303,6.9440444444444385,0.6836708621960256,0.6944444444444571,0.6944444444444571,0.6465648547221928,0.6919444444445162,0.6919444444445162,1.3302357169182184,1.3863888888889733,1.3863888888889733,10.27700007040972,11.883341049382722,11.883341049382722,11.541212872342115,13.269729938271656,13.269729938271666,3.344907004830903,3.6472222222222257,3.6472222222222257,4.92248906083693,6.919587922705303,6.9440444444444385,0.03389830508474576,0.9449152542372882 +230_1000,two_100_200,25.0,nominal,236,6.785125227216901,6.944444444444445,6.944444444444445,6.790488381233113,6.944444444444445,6.944444444444445,6.695563989191908,6.894731400966162,6.943644444444432,0.6787854545188172,0.6944444444444571,0.6944444444444571,0.6393786399372184,0.6894444444445185,0.6894444444445185,1.3181640944560356,1.3838888888889187,1.3838888888889187,6.961494940966431,7.807736625514416,7.807736625514423,8.241037853319801,9.191625514403313,9.191625514403313,2.308761996779391,2.481481481481481,2.481481481481482,4.1596370588719225,6.894731400966162,6.943644444444432,0.11864406779661017,0.8601694915254238 +230_1000,two_100_200,25.0,intensive,236,6.750689846884468,6.944444444444445,6.944444444444445,6.757045779087856,6.944444444444445,6.944444444444445,6.614659191026052,6.86987487922702,6.943244444444426,0.6753867812986212,0.6944444444444571,0.6944444444444571,0.6337032398579249,0.6869444444445207,0.6869444444445207,1.309090021156546,1.3813888888889778,1.3813888888889778,5.135541137028498,5.7705594135802585,5.7705594135802585,6.3993184974972435,7.151948302469236,7.151948302469236,1.7523945729263055,1.8986111111111157,1.8986111111111157,3.5664350691889193,6.86987487922702,6.943244444444426,0.19915254237288135,0.7796610169491526 +230_1000,two_150_250,5.0,soft,222,1.3733685946816387,1.3888888888888888,1.3888888888888888,1.3769512120816467,1.3888888888888888,1.3888888888888888,1.3290207381294525,1.3615697584540978,1.3881671497584374,0.20628467322671853,0.2083333333333428,0.2083333333333428,0.12957973668957068,0.13638888888889156,0.13638888888889156,0.33586440991628924,0.3447222222222308,0.3447222222222308,0.44296281915704516,0.4481558641975312,0.4481558641975454,0.7850142426362475,0.792878086419762,0.7928780864197762,0.9145397401622857,0.9194444444444514,0.9194444444444514,0.4021722287506129,1.3615697584540978,1.3881671497584374,0.46396396396396394,0.5225225225225225 +230_1000,two_150_250,5.0,nominal,222,1.3716928406667535,1.3888888888888888,1.3888888888888888,1.3755801192496837,1.3888888888888888,1.3888888888888888,1.2797191713452953,1.3342506280193065,1.3874454106279859,0.206068706455486,0.2083333333333428,0.2083333333333428,0.12707592635390358,0.13388888888889028,0.13388888888889028,0.3331446328093895,0.3422222222222331,0.3422222222222331,0.27307862380547876,0.27687242798354816,0.27687242798354816,0.6122226231449572,0.619094650205767,0.619094650205767,0.6758710133342606,0.6796296296296305,0.6796296296296305,0.2722592244419439,1.3342506280193065,1.3874454106279859,0.6261261261261262,0.36486486486486486 +230_1000,two_150_250,5.0,intensive,222,1.3691833224528867,1.3888888888888888,1.3888888888888888,1.37344161552857,1.3888888888888888,1.3888888888888888,1.2296501936719872,1.3069314975845154,1.3867236714975344,0.2057075580680814,0.2083333333333428,0.2083333333333428,0.12449537492932472,0.13138888888889255,0.13138888888889255,0.33020293299740605,0.33972222222223536,0.33972222222223536,0.1888916345791824,0.19185570987654899,0.19185570987654899,0.5250754956210629,0.5315779320987701,0.5315779320987701,0.5564704852456972,0.5597222222222222,0.5597222222222227,0.20476956521756046,1.3069314975845154,1.3867236714975344,0.7072072072072072,0.28378378378378377 +230_1000,two_150_250,15.0,soft,222,4.090861156808985,4.166666666666667,4.166666666666667,4.097617913565742,4.166666666666667,4.166666666666667,4.049687439613548,4.139347536231876,4.1659449275362155,0.6141359302781046,0.625,0.6250000000000284,0.3901490399057161,0.4141666666666737,0.4141666666666879,1.0042849701838208,1.0391666666666737,1.0391666666666879,3.9312965884405067,4.236736111111114,4.236736111111128,4.922163862867796,5.275902777777787,5.275902777777787,2.2146377746610657,2.308333333333337,2.308333333333337,2.3748056795927703,4.139347536231876,4.1659449275362155,0.13963963963963963,0.8423423423423423 +230_1000,two_150_250,15.0,nominal,222,4.070586055620841,4.166666666666667,4.166666666666667,4.07764747356052,4.166666666666667,4.166666666666667,3.981786525656132,4.112028405797084,4.165223188405764,0.6111300614308837,0.625,0.6250000000000284,0.38578529485272683,0.41166666666667595,0.41166666666669016,0.9969153562836104,1.036666666666676,1.0366666666666902,2.6291914061507082,2.7562962962962985,2.7562962962963127,3.6331379355175906,3.7929629629629744,3.7929629629629744,1.5629813374014772,1.6055555555555552,1.605555555555556,1.8687387387389953,4.112028405797084,4.165223188405764,0.25675675675675674,0.7252252252252253 +230_1000,two_150_250,15.0,intensive,222,4.054963990077032,4.166666666666667,4.166666666666667,4.063768533751142,4.166666666666667,4.166666666666667,3.919977111894559,4.084709275362294,4.1645014492753125,0.6089064484408799,0.625,0.6250000000000284,0.3820306998193211,0.4091666666666782,0.40916666666669244,0.990937148260201,1.0341666666666782,1.0341666666666924,1.9177415315744555,2.0167013888889187,2.0167013888889187,2.917129852120053,3.0508680555555685,3.0508680555555685,1.220182438192668,1.2541666666666664,1.2541666666666673,1.5296652696178274,4.084709275362294,4.1645014492753125,0.38288288288288286,0.5990990990990991 +230_1000,two_150_250,25.0,soft,222,6.836404917961434,6.944444444444445,6.944444444444445,6.843161674718191,6.944444444444445,6.944444444444445,6.795231200765998,6.917125314009653,6.943722705313993,1.0259674944509924,1.0416666666667425,1.0416666666667425,0.6532060490887157,0.6919444444444594,0.6919444444444594,1.6791735435397084,1.733611111111145,1.733611111111145,10.362329871134381,11.883341049382711,11.883341049382722,11.95134587354983,13.616952160493838,13.616952160493838,3.4136570048309025,3.697222222222223,3.697222222222223,4.897141232536989,6.917125314009653,6.943722705313993,0.036036036036036036,0.9459459459459459 +230_1000,two_150_250,25.0,nominal,222,6.785017635026331,6.944444444444445,6.944444444444445,6.79207905296601,6.944444444444445,6.944444444444445,6.696218105061622,6.889806183574862,6.943000966183542,1.0182947983417274,1.0416666666667425,1.0416666666667425,0.6457310858610491,0.6894444444444616,0.6894444444444616,1.6640258842027766,1.731111111111204,1.731111111111204,6.982563051157364,7.807736625514399,7.807736625514401,8.586991691599083,9.538847736625598,9.538847736625598,2.36471437773177,2.5314814814814817,2.5314814814814817,4.119931583757879,6.889806183574862,6.943000966183542,0.12612612612612611,0.8558558558558559 +230_1000,two_150_250,25.0,intensive,222,6.751718292205247,6.944444444444445,6.944444444444445,6.760522835879357,6.944444444444445,6.944444444444445,6.616731414022777,6.862487053140072,6.94227922705309,1.0134195937601325,1.0416666666667425,1.0416666666667425,0.6402087630998968,0.6869444444444639,0.6869444444444639,1.6536283568600292,1.7286111111111495,1.7286111111111495,5.218716991697903,5.7705594135802585,5.7705594135802585,6.82599142715461,7.499170524691408,7.499170524691408,1.828582574991583,1.94861111111112,1.94861111111112,3.5223522783656356,6.862487053140072,6.94227922705309,0.19369369369369369,0.7882882882882883 +230_1000,two_200_300,5.0,soft,211,1.373033413467043,1.3888888888888888,1.3888888888888888,1.3779876365134964,1.3888888888888888,1.3888888888888888,1.3292009890789218,1.3388888888888917,1.3866280193236622,0.2751187220610514,0.2777777777777857,0.2777777777777857,0.13200728952693241,0.13638888888889156,0.13638888888889156,0.4071260115879839,0.4141666666666737,0.4141666666666737,0.443285087744276,0.4481558641975312,0.4481558641975312,0.854351648226411,0.8623225308642049,0.8623225308642049,0.9649376668101615,0.9694444444444485,0.9694444444444485,0.40154428188760083,1.2908541062801535,1.3866280193236622,0.4786729857819905,0.5118483412322274 +230_1000,two_200_300,5.0,nominal,211,1.3718278086864946,1.3888888888888888,1.3888888888888888,1.376782031732948,1.3888888888888888,1.3888888888888888,1.279208736863798,1.2888888888888945,1.3843671497584356,0.27487760110494175,0.2777777777777857,0.2777777777777857,0.1294656787172998,0.13388888888889028,0.13388888888889028,0.40434327982224144,0.41166666666666885,0.41166666666666885,0.2734234282101569,0.27687242798354816,0.27687242798354816,0.6816776693066586,0.6885390946502099,0.6885390946502099,0.7263548415284157,0.7296296296296312,0.7296296296296312,0.26759488060084785,1.2168367149757873,1.3843671497584356,0.6113744075829384,0.38388625592417064 +230_1000,two_200_300,5.0,intensive,211,1.3700517526386875,1.3888888888888888,1.3888888888888888,1.3755764269523996,1.3888888888888888,1.3888888888888888,1.2292164846486746,1.2388888888888974,1.382106280193209,0.27460214890343454,0.2777777777777857,0.2777777777777857,0.12692406790767147,0.13138888888889255,0.13138888888889255,0.40152621681110606,0.40916666666666757,0.4091666666666711,0.18936696100079312,0.19185570987654899,0.19185570987654899,0.5949706237631145,0.601022376543213,0.601022376543213,0.6071342535081636,0.6097222222222243,0.6097222222222243,0.19539220184548028,1.142819323671421,1.382106280193209,0.6966824644549763,0.2985781990521327 +230_1000,two_200_300,15.0,soft,211,4.089752812693182,4.166666666666667,4.166666666666667,4.099231485678963,4.166666666666667,4.166666666666667,4.050444838244388,4.11666666666667,4.16440579710144,0.818898429837235,0.8333333333333712,0.8333333333333712,0.3973908268577725,0.4141666666666737,0.4141666666666737,1.2162892566950079,1.2475000000000023,1.2475000000000023,3.938435271018157,4.236736111111128,4.236736111111128,5.129177357974677,5.484236111111116,5.484236111111116,2.2681812560386545,2.3583333333333343,2.3583333333333343,2.368266117178499,4.068631884057932,4.16440579710144,0.14218009478672985,0.8436018957345972 +230_1000,two_200_300,15.0,nominal,211,4.0687412597019055,4.166666666666667,4.166666666666667,4.078219932687688,4.166666666666667,4.166666666666667,3.9806466378185377,4.066666666666673,4.162144927536214,0.8146961192389794,0.8333333333333712,0.8333333333333712,0.3928686212270729,0.41166666666667595,0.41166666666667595,1.2075647404660523,1.2450000000000045,1.2450000000000045,2.629519928371154,2.7562962962963127,2.7562962962963127,3.835264339438348,4.001296296296303,4.001296296296303,1.613554396135266,1.6555555555555557,1.655555555555556,1.8603587059553008,3.9946144927535654,4.162144927536214,0.26066350710900477,0.7251184834123223 +230_1000,two_200_300,15.0,intensive,211,4.055086640565973,4.166666666666667,4.166666666666667,4.066123854660351,4.166666666666667,4.166666666666667,3.9197639123566255,4.0166666666666755,4.159884057970987,0.812147614974771,0.8333333333333712,0.8333333333333712,0.3892379630927665,0.4091666666666782,0.4091666666666782,1.2013855780675373,1.2425000000000068,1.2425000000000068,1.910523806892058,2.0167013888889187,2.0167013888889187,3.1083953483940356,3.2592013888889255,3.2592013888889255,1.268274985883681,1.3041666666666671,1.3041666666666671,1.517942853218279,3.920597101449199,4.159884057970987,0.36492890995260663,0.6208530805687204 +230_1000,two_200_300,25.0,soft,211,6.835037928429144,6.944444444444445,6.944444444444445,6.844516601414927,6.944444444444445,6.944444444444445,6.795729953980353,6.8944444444444475,6.942183574879218,1.3679554529844258,1.3888888888889142,1.3888888888889142,0.665178490845682,0.6919444444444594,0.6919444444444594,2.0331339438301077,2.080833333333345,2.080833333333345,10.450472171859033,11.88334104938275,11.88334104938275,12.367416374757568,13.964174382716067,13.964174382716067,3.4824070048308986,3.74722222222222,3.74722222222222,4.889906220665428,6.846409661835709,6.942183574879218,0.037914691943127965,0.9478672985781991 +230_1000,two_200_300,25.0,nominal,211,6.781292231609314,6.944444444444445,6.944444444444445,6.790770904595096,6.944444444444445,6.944444444444445,6.693197609725946,6.84444444444445,6.939922705313991,1.3572063136204586,1.3888888888889142,1.3888888888889142,0.657382870832147,0.6894444444444616,0.6894444444444616,2.0145891844526056,2.0783333333333758,2.0783333333333758,7.004643066110208,7.807736625514417,7.807736625514423,8.935386006068818,9.88606995884777,9.88606995884777,2.4206667586841513,2.5814814814814824,2.5814814814814824,4.104975524875972,6.772392270531343,6.939922705313991,0.13270142180094788,0.8530805687203792 +230_1000,two_200_300,25.0,intensive,211,6.749553632346542,6.944444444444445,6.944444444444445,6.760590846440921,6.944444444444445,6.944444444444445,6.6142309041371945,6.794444444444453,6.937661835748765,1.3510410133308826,1.3888888888889142,1.3888888888889142,0.651943814685136,0.6869444444444639,0.6869444444444639,2.0029848280160185,2.0758333333333496,2.0758333333333496,5.201220435910335,5.7705594135802585,5.7705594135802585,7.126910312191698,7.84639274691358,7.846392746913581,1.8755240838930165,1.9986111111111171,1.9986111111111171,3.508621993269039,6.698374879226977,6.937661835748765,0.1943127962085308,0.7914691943127962 diff --git a/data/processed/lab039/lab039_emergency_path.png b/data/processed/lab039/lab039_emergency_path.png new file mode 100644 index 0000000..888c059 Binary files /dev/null and b/data/processed/lab039/lab039_emergency_path.png differ diff --git a/data/processed/lab039/lab039_emergency_stop_metrics.csv b/data/processed/lab039/lab039_emergency_stop_metrics.csv new file mode 100644 index 0000000..5cf54c7 --- /dev/null +++ b/data/processed/lab039/lab039_emergency_stop_metrics.csv @@ -0,0 +1,46 @@ +channel_condition,initial_speed_kmh,deceleration_profile,repetitions,delivered_fraction,mean_delivery_ms,p95_delivery_ms,max_delivery_ms,mean_path_during_delivery_m,mean_speed_at_receive_mps,mean_braking_distance_m,mean_total_path_m,p95_total_path_m,max_total_path_m,mean_time_to_stop_seconds,mean_copies_transmitted,mean_copies_lost,mean_ack_ms,acknowledgements_lost_mean,undelivered_by_500ms,local_watchdog_stage2_fraction_when_undelivered,local_watchdog_stop_fraction_when_undelivered,mean_local_watchdog_path_when_undelivered_m,mean_local_watchdog_stop_seconds_when_undelivered +no_loss,5.0,soft,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.0023703703703716883,1.3888888888888888,0.48225308641974607,0.48462345679011776,0.48462345679011776,0.48462345679011776,0.6961511111111065,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,5.0,nominal,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.0023703703703716883,1.3888888888888888,0.3215020576131735,0.3238724279835452,0.3238724279835452,0.3238724279835452,0.46466962962962555,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,5.0,intensive,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.0023703703703716883,1.3888888888888888,0.24112654320987303,0.24349691358024472,0.24349691358024472,0.24349691358024472,0.34892888888888507,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,15.0,soft,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.007111111111100854,4.166666666666667,4.3402777777777715,4.347388888888872,4.347388888888872,4.347388888888872,2.0850399999999993,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,15.0,nominal,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.007111111111100854,4.166666666666667,2.893518518518505,2.9006296296296057,2.9006296296296057,2.9006296296296057,1.3905955555555494,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,15.0,intensive,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.007111111111100854,4.166666666666667,2.170138888888914,2.177250000000015,2.177250000000015,2.177250000000015,1.043373333333328,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,25.0,soft,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.011851851851815809,6.944444444444445,12.056327160493936,12.068179012345752,12.068179012345752,12.068179012345752,3.473928888888885,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,25.0,nominal,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.011851851851815809,6.944444444444445,8.037551440329253,8.049403292181069,8.049403292181069,8.049403292181069,2.3165214814814803,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +no_loss,25.0,intensive,1,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.011851851851815809,6.944444444444445,6.028163580246883,6.0400154320986985,6.0400154320986985,6.0400154320986985,1.737817777777778,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,5.0,soft,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.0023703703703716883,1.3888888888888888,0.48225308641974607,0.48462345679011776,0.4846234567901185,0.48462345679013197,0.6961511111111065,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,5.0,nominal,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.0023703703703716883,1.3888888888888888,0.32150205761317324,0.32387242798354493,0.3238724279835452,0.3238724279835452,0.46466962962962555,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,5.0,intensive,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.0023703703703716883,1.3888888888888888,0.2411265432098733,0.243496913580245,0.24349691358024472,0.24349691358025893,0.34892888888888507,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,15.0,soft,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.007111111111100854,4.166666666666667,4.340277777777772,4.347388888888873,4.347388888888901,4.347388888888929,2.085039999999999,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,15.0,nominal,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.007111111111100854,4.166666666666667,2.893518518518506,2.900629629629608,2.900629629629634,2.900629629629634,1.3905955555555487,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,15.0,intensive,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.007111111111100854,4.166666666666667,2.170138888888914,2.177250000000015,2.1772500000000163,2.1772500000000434,1.0433733333333282,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,25.0,soft,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.011851851851815809,6.944444444444445,12.056327160493925,12.068179012345741,12.068179012345752,12.068179012345752,3.473928888888886,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,25.0,nominal,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.011851851851815809,6.944444444444445,8.037551440329255,8.04940329218107,8.049403292181125,8.049403292181182,2.3165214814814807,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +300_50,25.0,intensive,100,1.0,1.7066666666636365,1.7066666666636365,1.7066666666636365,0.011851851851815809,6.944444444444445,6.028163580246885,6.040015432098701,6.040015432098755,6.040015432098755,1.7378177777777772,1.0,0.0,2.8270000000034656,0.0,0,0.0,0.0,0.0,0.0 +260_200,5.0,soft,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.011893211704988162,1.3873163947163945,0.48120867111544835,0.4931018828204365,0.4913129154796394,0.6347317188984221,0.7022673659673898,1.14,0.15,9.901484071511305,0.0,1,1.0,0.0,0.0,0.0 +260_200,5.0,nominal,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.01183854978878465,1.3861774669774662,0.32033752457098297,0.33217607435976765,0.33056188667303843,0.4739806900918495,0.4706683242683485,1.14,0.15,9.901484071511305,0.0,1,1.0,1.0,0.29629820160617726,0.4446142450142645 +260_200,5.0,intensive,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.011783887872581281,1.385038539238539,0.23992474917157464,0.2517086370441559,0.25018637226975216,0.3936051756885348,0.3548688034188278,1.14,0.15,9.901484071511305,0.0,1,1.0,1.0,0.21058838740451336,0.32470683760685404 +260_200,15.0,soft,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.03580756895273697,4.165094172494173,4.3370493427894266,4.372856911742164,4.36745726495738,4.797713675213828,2.091156254856282,1.14,0.15,9.901484071511305,0.0,1,1.0,0.0,0.0,0.0 +260_200,15.0,nominal,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.03572562466010656,4.1598057498057495,2.88436432429012,2.9200899489502268,2.9206980056981164,3.3509544159545612,1.395211085211108,1.14,0.15,9.901484071511305,0.0,1,1.0,0.0,0.0,0.0 +260_200,15.0,intensive,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.03560317748300973,4.148275213675214,2.153732873898648,2.1893360513816575,2.1973183760684663,2.6275747863249137,1.0456779720279952,1.14,0.15,9.901484071511305,0.0,1,1.0,0.0,0.0,0.0 +260_200,25.0,soft,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.05972192620052655,6.94287195027195,12.050914705821564,12.110636632022086,12.101626305793332,12.818720322887145,3.480045143745168,1.14,0.15,9.901484071511305,0.0,1,1.0,0.0,0.0,0.0 +260_200,25.0,nominal,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.059639981907896135,6.937583527583527,8.022044545303693,8.081684527211593,8.082850585628597,8.79994460272286,2.3211370111370386,1.14,0.15,9.901484071511305,0.0,1,1.0,0.0,0.0,0.0 +260_200,25.0,intensive,100,0.99,8.609168609193993,6.523076923102167,109.78461538464757,0.05951753473079931,6.92605299145299,5.998985722901416,6.058503257632215,6.0734627255462215,6.7905567426403195,1.7401224164724454,1.14,0.15,9.901484071511305,0.0,1,1.0,0.0,0.0,0.0 +230_200,5.0,soft,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.005070783256114311,1.3816145410627985,0.4778999213484916,0.4829707046046059,0.48674584004952237,0.4867458400495366,0.6946403140143889,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,5.0,nominal,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.00492207236106708,1.3757255652173888,0.31670495235442575,0.3216270247154928,0.3259948112429214,0.3259948112429356,0.4624082318887861,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,5.0,intensive,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.0047770036124653355,1.3709463478260824,0.2365118217467824,0.24128882535924773,0.24561929683963513,0.24561929683964934,0.3465696304395107,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,15.0,soft,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.01569125900389963,4.151102753623183,4.310269346588058,4.325960605591957,4.353756038667086,4.353756038667086,2.079384420294584,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,15.0,nominal,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.015506514193235716,4.134074260869563,2.8545456477010283,2.870052161894264,2.906996779407791,2.9069967794078195,1.3818577971061752,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,15.0,intensive,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.015330329648746784,4.119692086956515,2.128605114165077,2.1439354438138234,2.1836171497782004,2.1836171497782004,1.0337560652221172,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,25.0,soft,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.026338602012188517,6.92888053140096,12.004702183410405,12.031040785422592,12.078790928642661,12.078790928642718,3.468273309183471,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,25.0,nominal,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.02612157369599572,6.9018719227053005,7.952178510548997,7.978300084244993,8.060015208477864,8.060015208477921,2.3044570177180925,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_200,25.0,intensive,100,1.0,3.8330434829908455,3.2347826134255797,63.06086956995216,0.025889161316264335,6.870107487922683,5.926597251158983,5.952486412475248,6.050627348395608,6.050627348395665,1.7213599154636643,1.01,0.01,5.294129565210852,0.0,0,0.0,0.0,0.0,0.0 +230_1000,5.0,soft,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.005441637180603624,1.3615992309967462,0.4703824580748979,0.47582409525550157,0.48674584004952237,0.48674584004952237,0.6850824903921393,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.0,0.0 +230_1000,5.0,nominal,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.005172681760664711,1.35857882283348,0.3128846621481798,0.3180573439088445,0.3259948112429214,0.3259948112429214,0.45714248250492684,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.0,0.0 +230_1000,5.0,intensive,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.004903726340725799,1.355558414670214,0.23435927438891613,0.23926300072964193,0.24561929683963513,0.24561929683963513,0.34317247856132055,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.0,0.0 +230_1000,15.0,soft,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.01942936013772663,4.0965816622300935,4.24621689326176,4.2656462533994866,4.353756038667086,4.353756038667086,2.054663147002654,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.10334108028823152,0.2958115942072368 +230_1000,15.0,nominal,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.01695233723055782,4.071791304347823,2.814567722174253,2.8315200594048116,2.9069967794077627,2.906996779407791,1.3615466430097056,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.0,0.0 +230_1000,15.0,intensive,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.016681898269086493,4.068312274475011,2.108137405425958,2.1248193036950447,2.1836171497782004,2.1836171497782004,1.0213609435125186,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.0,0.0 +230_1000,25.0,soft,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.037038212167910194,6.845943724736263,11.779048094181281,11.816086306349192,12.078790928642661,12.078790928642718,3.429344178255736,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,2.85405229876514,1.6847004830961296 +230_1000,25.0,nominal,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.03332475484321537,6.788020467317354,7.773218400003638,7.806543154846854,8.060015208477807,8.060015208477864,2.2690458049933917,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.42773369280956786,0.5189597423553849 +230_1000,25.0,intensive,100,0.98,6.372315887605183,3.2347826134255797,204.76521739605857,0.029638831345188375,6.738592507147784,5.796215049461146,5.825853880806336,6.050627348395608,6.050627348395665,1.6910204426745543,1.26,0.28,7.833402395782954,0.0,2,1.0,1.0,0.0038356779395769536,0.030966425122954888 diff --git a/data/processed/lab039/lab039_path_by_speed.png b/data/processed/lab039/lab039_path_by_speed.png new file mode 100644 index 0000000..86307a2 Binary files /dev/null and b/data/processed/lab039/lab039_path_by_speed.png differ diff --git a/data/processed/lab039/lab039_policy_comparison.png b/data/processed/lab039/lab039_policy_comparison.png new file mode 100644 index 0000000..be11115 Binary files /dev/null and b/data/processed/lab039/lab039_policy_comparison.png differ diff --git a/data/processed/lab039/lab039_reaction_rates.png b/data/processed/lab039/lab039_reaction_rates.png new file mode 100644 index 0000000..3f9625e Binary files /dev/null and b/data/processed/lab039/lab039_reaction_rates.png differ diff --git a/data/processed/lab039/lab039_report.txt b/data/processed/lab039/lab039_report.txt new file mode 100644 index 0000000..e543192 --- /dev/null +++ b/data/processed/lab039/lab039_report.txt @@ -0,0 +1,183 @@ +Lab039 — двухступенчатая безопасная реакция и оценка пути до остановки + +Состояние Git до реализации +- Корень: C:/Users/user/Desktop/projects/SDR_Rover +- Ветка: main +- HEAD: 23cfdf581b63d2674e7c48965aea45cc5afff2d7 +- Перед окончательным повторным запуском рабочее дерево содержало только новые файлы Lab039; индекс был пуст. +- Неизвестных изменений не было; локально известный origin/main имел ahead/behind 0/0. +- Lab036–Lab038 присутствовали; Lab038 зафиксирована коммитом 23cfdf5. +- Fetch, pull и push не выполнялись. + +Конечный автомат +- NORMAL поддерживает заданную скорость и принимает только команды с новым sequence. +- STAGE1_DECELERATION запрещает положительное ускорение и применяет a_stage1. +- STAGE2_BRAKING задаёт нулевую скорость и применяет a_stage2 до точной остановки. +- EMERGENCY_LATCHED выполняет ту же обязательную остановку, фиксируется и не снимается обычной командой. +- Свежая команда снимает только временные защитные состояния; старая и повторная команды таймер не обновляют. +- Предварительная реакция уменьшает скорость с возможностью мягкого восстановления, а обязательное торможение требует полной остановки. + +Порядок совпадающих событий +- Полностью полученная emergency-команда обрабатывается первой и фиксирует аварийную остановку. +- Полностью полученная свежая обычная команда обрабатывается раньше первого и второго порогов watchdog при одинаковом времени. +- Такая команда обновляет время свежести и отменяет переход, рассчитанный от предыдущей команды; затем очередь событий строится заново. +- Далее обрабатывается второй порог, затем первый; равные пороги запрещены проверкой ThresholdPolicy. +- Правило receive-before-threshold отдельно проверяется для обоих порогов. + +Параметры движения и эксперимента +- Длительность опыта: 120 с; команды: 20 Гц; a_resume=1.0 м/с². +- Основная матрица: 5 каналов × 4 политики × 3 скорости × 3 профиля = 180 сочетаний. +- Условия с потерями: 100 повторов; контроль без потерь: один детерминированный опыт. +- Скорости: 5, 15 и 25 км/ч; внутри модели используются м/с. +- Профили a_stage1/a_stage2: мягкий 0,5/2,0; номинальный 1,0/3,0; интенсивный 1,5/4,0 м/с². +- Интегрирование событийное и точное на каждом участке постоянного ускорения; крупный фиксированный шаг не используется. +- Ранее сформированный каталог результатов Lab039 удалён; все CSV, TXT и PNG получены заново одним полным запуском окончательного кода. +- Проверенные при построении нагрузки пакеты CRC/FEC: 12356/714. + +Компактная сводка 180 сочетаний +политика | реакции этапа 1, 1/мин (среднее) | торможения этапа 2, 1/мин (среднее) | полные остановки, 1/мин (среднее) | максимальный полный путь, м +Один порог 250 мс | 0.0000 | 1.2510 | 0.1078 | 13.7924 +Два порога 100/200 мс | 4.3680 | 1.6900 | 0.1303 | 13.2697 +Два порога 150/250 мс | 2.5890 | 1.2510 | 0.1146 | 13.6170 +Два порога 200/300 мс | 1.6900 | 0.9800 | 0.1024 | 13.9642 + +Расширенная сводка политик +политика | этап 1 ср/макс, 1/мин | этап 2 ср/макс, 1/мин | остановки ср/макс, 1/мин | путь ср/макс/P95макс, м | время этап 1/этап 2/ноль, % | потеря скорости, м/с | восстановление, с +Один порог 250 мс | 0.0000/0.0000 | 1.2510/2.3400 | 0.1078/0.7600 | 1.2516/13.7924/13.7924 | 0.0000/0.7027/0.1496 | 0.0000 | 0.6127 +Два порога 100/200 мс | 4.3680/11.3850 | 1.6900/2.9950 | 0.1303/0.8400 | 1.3003/13.2697/13.2697 | 0.4340/0.8205/0.1686 | 0.0256 | 0.5525 +Два порога 150/250 мс | 2.5890/4.2100 | 1.2510/2.3400 | 0.1146/0.7850 | 1.2081/13.6170/13.6170 | 0.2864/0.7027/0.1568 | 0.0220 | 0.5362 +Два порога 200/300 мс | 1.6900/2.9950 | 0.9800/1.8650 | 0.1024/0.7350 | 1.2571/13.9642/13.9642 | 0.2084/0.6121/0.1463 | 0.0219 | 0.5336 + +Интерпретация агрегированного пути +- Нулевой полный путь в строке сочетания означает отсутствие полной остановки в данном сочетании, а не отсутствие движения ровера. +- Средний путь, включающий нулевые значения сочетаний без полной остановки, нельзя использовать как единственный показатель безопасности. +- Для сравнения политик необходимо совместно учитывать максимальный путь, аналитический путь при длительной потере связи, частоту обязательных торможений и частоту полных остановок. + +Сравнение 100/200 и 150/250 мс по выбранным условиям +канал | скорость, км/ч | политика | этап 1/этап 2/остановки, 1/мин | путь ср/макс/P95макс, м | время этап 1/этап 2/ноль, % | потеря скорости, м/с | восстановление, с +260 кбит/с, помеха 200 мс | 5 | Два порога 100/200 мс | 4.4650/2.9300/0.3950 | 0.5553/0.7234/0.7234 | 0.6166/1.0200/0.1803 | 0.0492 | 0.4254 +260 кбит/с, помеха 200 мс | 5 | Два порога 150/250 мс | 3.7700/2.3400/0.3133 | 0.6292/0.7929/0.7929 | 0.4875/0.8047/0.1435 | 0.0358 | 0.4040 +260 кбит/с, помеха 200 мс | 15 | Два порога 100/200 мс | 4.4650/2.9300/0.0100 | 0.8148/2.8425/2.8425 | 0.6166/1.0200/0.0038 | 0.0485 | 0.4887 +260 кбит/с, помеха 200 мс | 15 | Два порога 150/250 мс | 3.7700/2.3400/0.0067 | 0.8181/3.0509/3.0509 | 0.4875/0.8047/0.0026 | 0.0355 | 0.4626 +260 кбит/с, помеха 200 мс | 25 | Два порога 100/200 мс | 4.4650/2.9300/0.0000 | 0.0000/0.0000/0.0000 | 0.6166/1.0200/0.0000 | 0.0484 | 0.4887 +260 кбит/с, помеха 200 мс | 25 | Два порога 150/250 мс | 3.7700/2.3400/0.0000 | 0.0000/0.0000/0.0000 | 0.4875/0.8047/0.0000 | 0.0354 | 0.4619 +230 кбит/с, помеха 200 мс | 5 | Два порога 100/200 мс | 4.8100/2.9950/0.3783 | 0.5574/0.7234/0.7234 | 0.6405/1.0384/0.1851 | 0.0415 | 0.4091 +230 кбит/с, помеха 200 мс | 5 | Два порога 150/250 мс | 3.8550/2.3150/0.2983 | 0.6301/0.7929/0.7929 | 0.5002/0.8226/0.1486 | 0.0414 | 0.3972 +230 кбит/с, помеха 200 мс | 15 | Два порога 100/200 мс | 4.8100/2.9950/0.0167 | 2.1422/3.5846/3.5846 | 0.6405/1.0384/0.0090 | 0.0415 | 0.4642 +230 кбит/с, помеха 200 мс | 15 | Два порога 150/250 мс | 3.8550/2.3150/0.0133 | 2.2813/3.7930/3.7930 | 0.5002/0.8226/0.0076 | 0.0414 | 0.4523 +230 кбит/с, помеха 200 мс | 25 | Два порога 100/200 мс | 4.8100/2.9950/0.0017 | 2.3840/7.1519/7.1519 | 0.6405/1.0384/0.0002 | 0.0415 | 0.4656 +230 кбит/с, помеха 200 мс | 25 | Два порога 150/250 мс | 3.8550/2.3150/0.0000 | 0.0000/0.0000/0.0000 | 0.5002/0.8226/0.0000 | 0.0412 | 0.4533 +230 кбит/с, помеха 1000 мс | 5 | Два порога 100/200 мс | 1.1800/1.0550/0.7050 | 0.5691/0.7234/0.7234 | 0.1867/1.9272/1.3055 | 0.0092 | 0.9961 +230 кбит/с, помеха 1000 мс | 5 | Два порога 150/250 мс | 1.1100/1.0350/0.6650 | 0.6408/0.7929/0.7929 | 0.1773/1.8405/1.2442 | 0.0049 | 0.9795 +230 кбит/с, помеха 1000 мс | 15 | Два порога 100/200 мс | 1.1800/1.0550/0.3083 | 3.6007/5.0676/5.0676 | 0.1867/1.9272/0.5730 | 0.0092 | 2.0091 +230 кбит/с, помеха 1000 мс | 15 | Два порога 150/250 мс | 1.1100/1.0350/0.2883 | 3.8241/5.2759/5.2759 | 0.1773/1.8405/0.5452 | 0.0049 | 1.9554 +230 кбит/с, помеха 1000 мс | 25 | Два порога 100/200 мс | 1.1800/1.0550/0.1383 | 8.7272/13.2697/13.2697 | 0.1867/1.9272/0.2724 | 0.0092 | 2.3735 +230 кбит/с, помеха 1000 мс | 25 | Два порога 150/250 мс | 1.1100/1.0350/0.1317 | 9.1214/13.6170/13.6170 | 0.1773/1.8405/0.2596 | 0.0049 | 2.3052 +- Полные данные каждой комбинации находятся в lab039_summary.csv, lab039_watchdog_metrics.csv и lab039_distance_metrics.csv. + +Путь и защитные реакции +- Максимальный наблюдавшийся промежуток без свежей команды: 6546.922 мс. +- Максимальное время применения устаревшей команды до обязательного торможения: 300 мс. +- Максимальный путь до первой реакции: 1.7361 м. +- Максимальный путь до второго порога: 2.0808 м. +- Максимальный тормозной путь после второго порога: 12.0563 м. +- Максимальный полный путь после последней свежей команды: 13.9642 м. +- Частота предварительных реакций: 0.0000…11.3850 1/мин. +- Частота полных остановок: 0.0000…0.8400 1/мин. +- Произведение v × timeout описывает только путь до порога; после него ровер сохраняет скорость и проходит дополнительный тормозной путь. +- Путь реакции растёт линейно со скоростью, а идеализированный тормозной путь v²/(2a) — квадратично, поэтому высокая начальная скорость особенно существенна. +- Короткий первый порог чаще пересекается обычными краткими помехами и вызывает лишние замедления. +- Длинный второй порог дольше сохраняет движение до обязательного торможения и увеличивает полный путь. + +Аналитические контрольные расчёты без восстановления связи +скорость, км/ч | профиль | один порог: реакция/торможение/итого, м | 150/250: реакция/замедление/торможение/итого, м | разница, м | ошибка модели, м +5 | Мягкий | 0.3472/0.4823/0.8295 | 0.2083/0.1364/0.4482/0.7929 | -0.0366 | 0.000e+00 +5 | Номинальный | 0.3472/0.3215/0.6687 | 0.2083/0.1339/0.2769/0.6191 | -0.0496 | 0.000e+00 +5 | Интенсивный | 0.3472/0.2411/0.5883 | 0.2083/0.1314/0.1919/0.5316 | -0.0568 | 0.000e+00 +15 | Мягкий | 1.0417/4.3403/5.3819 | 0.6250/0.4142/4.2367/5.2759 | -0.1060 | 0.000e+00 +15 | Номинальный | 1.0417/2.8935/3.9352 | 0.6250/0.4117/2.7563/3.7930 | -0.1422 | 0.000e+00 +15 | Интенсивный | 1.0417/2.1701/3.2118 | 0.6250/0.4092/2.0167/3.0509 | -0.1609 | 0.000e+00 +25 | Мягкий | 1.7361/12.0563/13.7924 | 1.0417/0.6919/11.8833/13.6170 | -0.1755 | 0.000e+00 +25 | Номинальный | 1.7361/8.0376/9.7737 | 1.0417/0.6894/7.8077/9.5388 | -0.2348 | 0.000e+00 +25 | Интенсивный | 1.7361/6.0282/7.7643 | 1.0417/0.6869/5.7706/7.4992 | -0.2651 | 0.000e+00 +- Максимальная абсолютная ошибка событийной модели: 0.000e+00 м. + +Независимая аварийная остановка +- Расчёт: 45 сочетаний; emergency сформирована на 60-й секунде; политика локального таймера 150/250 мс. +- Итоговая доставка за окно 500 мс: 98.000…100.000%. +- Время первой доставки: среднее до 8.609 мс, P95 до 6.523 мс, максимум 204.765 мс. +- Путь за время доставки: до 0.0597 м в среднем по сочетанию. +- Тормозной путь после получения: до 12.0563 м в среднем по сочетанию. +- Полный путь от формирования до остановки: среднее до 12.1106 м; максимум 12.8187 м. +- Недоставок за 500 мс: 2 в одном канальном условии, 3 суммарно в независимых транспортных опытах. +- При недоставке доля опытов с включением второго этапа локального таймера: до 100.000%. +- При недоставке доля остановок локальным таймером: до 100.000%. +- Средний путь локальной остановки при недоставке: до 2.8541 м; время — до 1.6847 с. +- Удалённая emergency не заменяет локальный сторожевой таймер: канал может быть физически недоступен, а локальная реакция не зависит от доставки. +- ACK лишь прекращает будущие копии и информирует отправителя; торможение начинается при первом корректном emergency до получения ACK. + +Инварианты безопасности +- Отрицательная скорость: 0 случаев. +- Превышение заданной скорости: 0 случаев. +- Второй порог превышен без торможения: 0 случаев. +- Снятие временного состояния старой командой: 0 случаев. +- Снятие аварийной остановки обычной командой: 0 случаев. + +Интерпретация пары 150/250 мс +- Для 150/250 мс средняя частота предварительных реакций по матрице: 2.5890 1/мин; полных остановок: 0.1146 1/мин. +- Для 100/200 мс соответствующие значения: 4.3680 и 0.1303 1/мин; для 200/300 мс: 1.6900 и 0.1024 1/мин. +- Максимальный полный путь 150/250 мс: 13.6170 м; 100/200 мс: 13.2697 м; 200/300 мс: 13.9642 м. +- Эти результаты характеризуют компромисс, но не подтверждают окончательный выбор: пороги и замедления автоматически не назначаются. + +Ограничения модели +- a_stage1 и a_stage2 являются исследовательскими параметрами и должны быть измерены на реальном ровере. +- Не моделируются уклон, пробуксовка, задержка электромеханического тормоза, изменение сцепления и сопротивление воздуха. +- Не моделируются поперечная динамика, перенос массы, ABS и фактическое время нарастания тормозного момента. +- Это расчётная одномерная модель, а не окончательный алгоритм силовой части и не замена натурных испытаний. + +Функциональные проверки +- PASS 01_fresh_command_updates_watchdog: fresh sequence updates timer +- PASS 02_old_command_does_not_update_watchdog: old sequence ignored +- PASS 03_duplicate_does_not_update_watchdog: equal sequence ignored +- PASS 04_first_threshold_enters_stage1: 150 ms enters preliminary deceleration +- PASS 05_second_threshold_enters_stage2: 250 ms enters mandatory braking +- PASS 06_single_threshold_skips_stage1: single threshold goes directly to stage2 +- PASS 07_stage1_forbids_positive_acceleration: stage1 acceleration is non-positive +- PASS 08_stage2_commands_zero_speed: stage2 applies mandatory braking to zero +- PASS 09_speed_never_negative: braking is clipped at zero +- PASS 10_constant_acceleration_matches_formula: v and s match analytic formula +- PASS 11_internal_zero_crossing_is_exact: internal stop time integrated exactly +- PASS 12_new_command_releases_temporary_state: fresh command releases temporary state +- PASS 13_old_command_does_not_release_state: old command cannot release stage1 +- PASS 14_emergency_enters_latched_state: first emergency latches state +- PASS 15_normal_command_does_not_unlatch: ordinary command cannot unlatch emergency +- PASS 16_ack_not_required_for_braking: braking starts before any ACK +- PASS 17_lost_ack_continues_repetition: controlled first ACK loss deterministically causes exactly one later copy +- PASS 18_received_ack_stops_future_copies: received ACK stops future copies +- PASS 19_stage2_threshold_never_missed: second threshold always enters braking +- PASS 20_fixed_seed_reproducibility: identical seed gives identical intervals +- PASS 21_fresh_command_wins_first_threshold_tie: fresh command at stage1 time is received before the threshold +- PASS 22_fresh_command_wins_second_threshold_tie: fresh command at stage2 time is received before mandatory braking + +Созданные файлы +- protocol/two_stage_failsafe.py +- tests/lab039_two_stage_braking.py +- data/processed/lab039/lab039_summary.csv +- data/processed/lab039/lab039_watchdog_metrics.csv +- data/processed/lab039/lab039_distance_metrics.csv +- data/processed/lab039/lab039_emergency_stop_metrics.csv +- data/processed/lab039/lab039_analytic_checks.csv +- data/processed/lab039/lab039_report.txt +- data/processed/lab039/lab039_path_by_speed.png +- data/processed/lab039/lab039_policy_comparison.png +- data/processed/lab039/lab039_deceleration_profiles.png +- data/processed/lab039/lab039_reaction_rates.png +- data/processed/lab039/lab039_safety_state_time.png +- data/processed/lab039/lab039_emergency_path.png +- data/processed/lab039/lab039_analytic_vs_model.png +- data/processed/lab039/lab039_tradeoff.png + +Состояние результатов +- Lab039 оставлена вне индекса Git и не закоммичена. +- Lab028–Lab038 не изменялись. +- Сохранены только компактные агрегированные CSV, TXT и PNG; запрещённые артефакты не создавались. diff --git a/data/processed/lab039/lab039_safety_state_time.png b/data/processed/lab039/lab039_safety_state_time.png new file mode 100644 index 0000000..f3c9d47 Binary files /dev/null and b/data/processed/lab039/lab039_safety_state_time.png differ diff --git a/data/processed/lab039/lab039_summary.csv b/data/processed/lab039/lab039_summary.csv new file mode 100644 index 0000000..11a7259 --- /dev/null +++ b/data/processed/lab039/lab039_summary.csv @@ -0,0 +1,181 @@ +channel_condition,policy,initial_speed_kmh,deceleration_profile,repetitions,preliminary_reactions_per_minute,mandatory_brakings_per_minute,full_stops_per_minute,mean_total_stop_path_m,p95_total_stop_path_m,max_total_stop_path_m,max_command_gap_ms,stage1_time_fraction,stage2_time_fraction,zero_speed_fraction,negative_speed_cases,target_speed_exceeded_cases,missed_stage2_cases,stale_command_release_cases,ordinary_command_emergency_release_cases +no_loss,single_250,5.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,5.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,5.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,15.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,15.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,15.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,25.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,25.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,single_250,25.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,5.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,5.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,5.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,15.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,15.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,15.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,25.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,25.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_100_200,25.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,5.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,5.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,5.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,15.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,15.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,15.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,25.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,25.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_150_250,25.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,5.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,5.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,5.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,15.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,15.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,15.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,25.0,soft,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,25.0,nominal,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +no_loss,two_200_300,25.0,intensive,1,0.0,0.0,0.0,0.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0,0,0,0,0 +300_50,single_250,5.0,soft,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,single_250,5.0,nominal,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,single_250,5.0,intensive,100,0.0,0.565,0.005,0.5883487654320945,0.5883487654320945,0.5883487654320945,597.5733333333295,0.0,0.0004549733611111169,5.471509259258702e-06,0,0,0,0,0 +300_50,single_250,15.0,soft,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,single_250,15.0,nominal,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,single_250,15.0,intensive,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,single_250,25.0,soft,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,single_250,25.0,nominal,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,single_250,25.0,intensive,100,0.0,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_100_200,5.0,soft,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_100_200,5.0,nominal,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_100_200,5.0,intensive,100,11.385,1.47,0.005,0.46213348765432727,0.46213348765432727,0.46213348765432727,597.5733333333295,0.0072607061111124895,0.0011692007499999651,1.2763175925925178e-05,0,0,0,0,0 +300_50,two_100_200,15.0,soft,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_100_200,15.0,nominal,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_100_200,15.0,intensive,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_100_200,25.0,soft,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_100_200,25.0,nominal,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_100_200,25.0,intensive,100,11.385,1.47,0.0,0.0,0.0,0.0,597.5733333333295,0.0072607061111124895,0.0011692007499999651,0.0,0,0,0,0,0 +300_50,two_150_250,5.0,soft,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_150_250,5.0,nominal,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_150_250,5.0,intensive,100,4.21,0.565,0.005,0.531577932098763,0.531577932098763,0.531577932098763,597.5733333333295,0.0026701592222223226,0.0004549733611111169,8.596509259258746e-06,0,0,0,0,0 +300_50,two_150_250,15.0,soft,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_150_250,15.0,nominal,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_150_250,15.0,intensive,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_150_250,25.0,soft,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_150_250,25.0,nominal,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_150_250,25.0,intensive,100,4.21,0.565,0.0,0.0,0.0,0.0,597.5733333333295,0.0026701592222223226,0.0004549733611111169,0.0,0,0,0,0,0 +300_50,two_200_300,5.0,soft,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,5.0,nominal,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,5.0,intensive,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,15.0,soft,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,15.0,nominal,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,15.0,intensive,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,25.0,soft,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,25.0,nominal,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +300_50,two_200_300,25.0,intensive,100,1.47,0.205,0.0,0.0,0.0,0.0,597.5733333333295,0.0009794275277777414,0.00018977322222222385,0.0,0,0,0,0,0 +260_200,single_250,5.0,soft,100,0.0,2.34,0.11,0.7988287491582475,0.8294753086419746,0.8294753086419888,1553.3846153846298,0.0,0.008047035814101813,0.00045221060042689417,0,0,0,0,0 +260_200,single_250,5.0,nominal,100,0.0,2.34,0.26,0.6482391519060329,0.6687242798354021,0.6687242798354021,1553.3846153846298,0.0,0.008047035814101813,0.0012010270933040664,0,0,0,0,0 +260_200,single_250,5.0,intensive,100,0.0,2.34,0.45,0.5759331801903396,0.5883487654321016,0.5883487654321016,1553.3846153846298,0.0,0.008047035814101813,0.0020279770498569305,0,0,0,0,0 +260_200,single_250,15.0,soft,100,0.0,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.0,0.008047035814101813,0.0,0,0,0,0,0 +260_200,single_250,15.0,nominal,100,0.0,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.0,0.008047035814101813,0.0,0,0,0,0,0 +260_200,single_250,15.0,intensive,100,0.0,2.34,0.015,2.4355011185144235,3.211805555555594,3.2118055555555998,1553.3846153846298,0.0,0.008047035814101813,5.860833333324765e-05,0,0,0,0,0 +260_200,single_250,25.0,soft,100,0.0,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.0,0.008047035814101813,0.0,0,0,0,0,0 +260_200,single_250,25.0,nominal,100,0.0,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.0,0.008047035814101813,0.0,0,0,0,0,0 +260_200,single_250,25.0,intensive,100,0.0,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.0,0.008047035814101813,0.0,0,0,0,0,0 +260_200,two_100_200,5.0,soft,100,4.465,2.93,0.125,0.6776667572835481,0.7234336419753191,0.7234336419753191,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0006257084636746991,0,0,0,0,0 +260_200,two_100_200,5.0,nominal,100,4.465,2.93,0.4,0.5349063198533109,0.5496502057613242,0.5496502057613384,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0017914852129624007,0,0,0,0,0 +260_200,two_100_200,5.0,intensive,100,4.465,2.93,0.66,0.4534105756717147,0.46213348765432727,0.46213348765432727,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0029912988725062117,0,0,0,0,0 +260_200,two_100_200,15.0,soft,100,4.465,2.93,0.0,0.0,0.0,0.0,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0,0,0,0,0,0 +260_200,two_100_200,15.0,nominal,100,4.465,2.93,0.0,0.0,0.0,0.0,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0,0,0,0,0,0 +260_200,two_100_200,15.0,intensive,100,4.465,2.93,0.03,2.4444895763511703,2.84253472222224,2.84253472222224,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.00011300018589728251,0,0,0,0,0 +260_200,two_100_200,25.0,soft,100,4.465,2.93,0.0,0.0,0.0,0.0,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0,0,0,0,0,0 +260_200,two_100_200,25.0,nominal,100,4.465,2.93,0.0,0.0,0.0,0.0,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0,0,0,0,0,0 +260_200,two_100_200,25.0,intensive,100,4.465,2.93,0.0,0.0,0.0,0.0,1553.3846153846298,0.0061662966923077675,0.010199767410255816,0.0,0,0,0,0,0 +260_200,two_150_250,5.0,soft,100,3.77,2.34,0.12,0.7646759161522665,0.792878086419762,0.792878086419762,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0005152519109681763,0,0,0,0,0 +260_200,two_150_250,5.0,nominal,100,3.77,2.34,0.325,0.6029963747286375,0.619094650205767,0.619094650205767,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0014273649850418452,0,0,0,0,0 +260_200,two_150_250,5.0,intensive,100,3.77,2.34,0.495,0.5198646663125392,0.5315779320987701,0.5315779320987701,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0023632394985747623,0,0,0,0,0 +260_200,two_150_250,15.0,soft,100,3.77,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0,0,0,0,0,0 +260_200,two_150_250,15.0,nominal,100,3.77,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0,0,0,0,0,0 +260_200,two_150_250,15.0,intensive,100,3.77,2.34,0.02,2.4542928207233814,3.0508680555555543,3.0508680555555543,1553.3846153846298,0.004874652275641122,0.008047035814101813,7.686239316227155e-05,0,0,0,0,0 +260_200,two_150_250,25.0,soft,100,3.77,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0,0,0,0,0,0 +260_200,two_150_250,25.0,nominal,100,3.77,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0,0,0,0,0,0 +260_200,two_150_250,25.0,intensive,100,3.77,2.34,0.0,0.0,0.0,0.0,1553.3846153846298,0.004874652275641122,0.008047035814101813,0.0,0,0,0,0,0 +260_200,two_200_300,5.0,soft,100,2.93,1.825,0.095,0.8262068068197808,0.8623225308642049,0.8623225308642049,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.00039858852065484315,0,0,0,0,0 +260_200,two_200_300,5.0,nominal,100,2.93,1.825,0.26,0.6675099096312059,0.6885390946502099,0.6885390946502099,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.0011301937599707363,0,0,0,0,0 +260_200,two_200_300,5.0,intensive,100,2.93,1.825,0.4,0.5866798345992185,0.601022376543213,0.601022376543213,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.0019008925491447405,0,0,0,0,0 +260_200,two_200_300,15.0,soft,100,2.93,1.825,0.0,0.0,0.0,0.0,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.0,0,0,0,0,0 +260_200,two_200_300,15.0,nominal,100,2.93,1.825,0.0,0.0,0.0,0.0,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.0,0,0,0,0,0 +260_200,two_200_300,15.0,intensive,100,2.93,1.825,0.015,2.477132721078533,3.2592013888889197,3.2592013888889255,1553.3846153846298,0.003856901653846757,0.006342865756409058,5.548333333324783e-05,0,0,0,0,0 +260_200,two_200_300,25.0,soft,100,2.93,1.825,0.0,0.0,0.0,0.0,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.0,0,0,0,0,0 +260_200,two_200_300,25.0,nominal,100,2.93,1.825,0.0,0.0,0.0,0.0,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.0,0,0,0,0,0 +260_200,two_200_300,25.0,intensive,100,2.93,1.825,0.0,0.0,0.0,0.0,1553.3846153846298,0.003856901653846757,0.006342865756409058,0.0,0,0,0,0,0 +230_200,single_250,5.0,soft,100,0.0,2.315,0.1,0.8103861158165095,0.8294753086419746,0.8294753086419746,1938.2260869568952,0.0,0.008226305797102696,0.000514733896940646,0,0,0,0,0 +230_200,single_250,5.0,nominal,100,0.0,2.315,0.26,0.6513190118442785,0.6687242798354021,0.6687242798354021,1938.2260869568952,0.0,0.008226305797102696,0.0012808948470213028,0,0,0,0,0 +230_200,single_250,5.0,intensive,100,0.0,2.315,0.46,0.575181146443294,0.5883487654321016,0.5883487654321016,1938.2260869568952,0.0,0.008226305797102696,0.002076788405797635,0,0,0,0,0 +230_200,single_250,15.0,soft,100,0.0,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.0,0.008226305797102696,0.0,0,0,0,0,0 +230_200,single_250,15.0,nominal,100,0.0,2.315,0.01,3.9351851851851762,3.935185185185189,3.9351851851851904,1938.2260869568952,0.0,0.008226305797102696,5.119388083742042e-05,0,0,0,0,0 +230_200,single_250,15.0,intensive,100,0.0,2.315,0.02,3.211805555555559,3.211805555555592,3.2118055555555998,1938.2260869568952,0.0,0.008226305797102696,0.0001472850241546552,0,0,0,0,0 +230_200,single_250,25.0,soft,100,0.0,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.0,0.008226305797102696,0.0,0,0,0,0,0 +230_200,single_250,25.0,nominal,100,0.0,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.0,0.008226305797102696,0.0,0,0,0,0,0 +230_200,single_250,25.0,intensive,100,0.0,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.0,0.008226305797102696,0.0,0,0,0,0,0 +230_200,two_100_200,5.0,soft,100,4.81,2.995,0.115,0.7016949739859344,0.7234336419753191,0.7234336419753191,1938.2260869568952,0.006404715942029555,0.010383782608696294,0.0006719713365541712,0,0,0,0,0 +230_200,two_100_200,5.0,nominal,100,4.81,2.995,0.365,0.5303238165666804,0.5496502057613242,0.5496502057613384,1938.2260869568952,0.006404715942029555,0.010383782608696294,0.0018144038647347485,0,0,0,0,0 +230_200,two_100_200,5.0,intensive,100,4.81,2.995,0.655,0.440287161468805,0.46213348765432727,0.46213348765432727,1938.2260869568952,0.006404715942029555,0.010383782608696294,0.0030680473027381683,0,0,0,0,0 +230_200,two_100_200,15.0,soft,100,4.81,2.995,0.0,0.0,0.0,0.0,1938.2260869568952,0.006404715942029555,0.010383782608696294,0.0,0,0,0,0,0 +230_200,two_100_200,15.0,nominal,100,4.81,2.995,0.015,3.5846296296296294,3.5846296296296316,3.5846296296296316,1938.2260869568952,0.006404715942029555,0.010383782608696294,7.693719806769252e-05,0,0,0,0,0 +230_200,two_100_200,15.0,intensive,100,4.81,2.995,0.035,2.8420072908206566,2.84253472222224,2.84253472222224,1938.2260869568952,0.006404715942029555,0.010383782608696294,0.00019270567632860566,0,0,0,0,0 +230_200,two_100_200,25.0,soft,100,4.81,2.995,0.0,0.0,0.0,0.0,1938.2260869568952,0.006404715942029555,0.010383782608696294,0.0,0,0,0,0,0 +230_200,two_100_200,25.0,nominal,100,4.81,2.995,0.0,0.0,0.0,0.0,1938.2260869568952,0.006404715942029555,0.010383782608696294,0.0,0,0,0,0,0 +230_200,two_100_200,25.0,intensive,100,4.81,2.995,0.005,7.1519483024691795,7.1519483024691795,7.1519483024691795,1938.2260869568952,0.006404715942029555,0.010383782608696294,7.23747987120719e-06,0,0,0,0,0 +230_200,two_150_250,5.0,soft,100,3.855,2.315,0.1,0.7702604841740005,0.792878086419762,0.792878086419762,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.0005626505636073119,0,0,0,0,0 +230_200,two_150_250,5.0,nominal,100,3.855,2.315,0.29,0.6028842589022702,0.619094650205767,0.619094650205767,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.001466152012882828,0,0,0,0,0 +230_200,two_150_250,5.0,intensive,100,3.855,2.315,0.505,0.5172203308829381,0.5315779320987701,0.5315779320987701,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.0024288750000005677,0,0,0,0,0 +230_200,two_150_250,15.0,soft,100,3.855,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.0,0,0,0,0,0 +230_200,two_150_250,15.0,nominal,100,3.855,2.315,0.015,3.792962962962953,3.792962962962965,3.7929629629629673,1938.2260869568952,0.005001884057970516,0.008226305797102696,6.443719806769294e-05,0,0,0,0,0 +230_200,two_150_250,15.0,intensive,100,3.855,2.315,0.025,3.0508680555555543,3.0508680555555543,3.0508680555555543,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.0001631696859904028,0,0,0,0,0 +230_200,two_150_250,25.0,soft,100,3.855,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.0,0,0,0,0,0 +230_200,two_150_250,25.0,nominal,100,3.855,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.0,0,0,0,0,0 +230_200,two_150_250,25.0,intensive,100,3.855,2.315,0.0,0.0,0.0,0.0,1938.2260869568952,0.005001884057970516,0.008226305797102696,0.0,0,0,0,0,0 +230_200,two_200_300,5.0,soft,100,2.995,1.865,0.085,0.8623225308641987,0.8623225308642049,0.8623225308642049,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0004640957326893967,0,0,0,0,0 +230_200,two_200_300,5.0,nominal,100,2.995,1.865,0.255,0.6702734755043244,0.6885390946502099,0.6885390946502099,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0012076871712295588,0,0,0,0,0 +230_200,two_200_300,5.0,intensive,100,2.995,1.865,0.395,0.5855586647391154,0.601022376543213,0.601022376543213,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0019341896135270343,0,0,0,0,0 +230_200,two_200_300,15.0,soft,100,2.995,1.865,0.0,0.0,0.0,0.0,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0,0,0,0,0,0 +230_200,two_200_300,15.0,nominal,100,2.995,1.865,0.01,4.001296296296289,4.001296296296289,4.001296296296289,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,4.8416103059642795e-05,0,0,0,0,0 +230_200,two_200_300,15.0,intensive,100,2.995,1.865,0.015,3.259201388888876,3.2592013888888878,3.25920138888889,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0001397844202899152,0,0,0,0,0 +230_200,two_200_300,25.0,soft,100,2.995,1.865,0.0,0.0,0.0,0.0,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0,0,0,0,0,0 +230_200,two_200_300,25.0,nominal,100,2.995,1.865,0.0,0.0,0.0,0.0,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0,0,0,0,0,0 +230_200,two_200_300,25.0,intensive,100,2.995,1.865,0.0,0.0,0.0,0.0,1938.2260869568952,0.0038694840579704625,0.0065142985507258356,0.0,0,0,0,0,0 +230_1000,single_250,5.0,soft,100,0.0,1.035,0.51,0.8223001645049943,0.8294753086419746,0.8294753086419888,6546.921739131583,0.0,0.018404613043477867,0.010031135426731688,0,0,0,0,0 +230_1000,single_250,5.0,nominal,100,0.0,1.035,0.655,0.6623059998776091,0.6687242798354021,0.6687242798354021,6546.921739131583,0.0,0.018404613043477867,0.012342763123993643,0,0,0,0,0 +230_1000,single_250,5.0,intensive,100,0.0,1.035,0.76,0.5826735237163153,0.5883487654321016,0.5883487654321016,6546.921739131583,0.0,0.018404613043477867,0.013786482729468781,0,0,0,0,0 +230_1000,single_250,15.0,soft,100,0.0,1.035,0.155,5.046971004055289,5.381944444444457,5.381944444444457,6546.921739131583,0.0,0.018404613043477867,0.0029537632850248157,0,0,0,0,0 +230_1000,single_250,15.0,nominal,100,0.0,1.035,0.28,3.7761954423601787,3.935185185185219,3.935185185185219,6546.921739131583,0.0,0.018404613043477867,0.005433619484703018,0,0,0,0,0 +230_1000,single_250,15.0,intensive,100,0.0,1.035,0.405,3.0719853935142036,3.2118055555555998,3.2118055555555998,6546.921739131583,0.0,0.018404613043477867,0.007416253864735419,0,0,0,0,0 +230_1000,single_250,25.0,soft,100,0.0,1.035,0.04,12.206108524515997,13.792438271604954,13.792438271604965,6546.921739131583,0.0,0.018404613043477867,0.0008522938808378088,0,0,0,0,0 +230_1000,single_250,25.0,nominal,100,0.0,1.035,0.14,8.833932616374762,9.773662551440339,9.773662551440339,6546.921739131583,0.0,0.018404613043477867,0.0025385002683849934,0,0,0,0,0 +230_1000,single_250,25.0,intensive,100,0.0,1.035,0.215,7.0867966282555725,7.764274691358025,7.764274691358025,6546.921739131583,0.0,0.018404613043477867,0.0041265349033824525,0,0,0,0,0 +230_1000,two_100_200,5.0,soft,100,1.18,1.055,0.55,0.7132345191903162,0.7234336419753191,0.7234336419753191,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.010741405072464415,0,0,0,0,0 +230_1000,two_100_200,5.0,nominal,100,1.18,1.055,0.725,0.5423399629289455,0.5496502057613242,0.5496502057613242,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.013386441116478949,0,0,0,0,0 +230_1000,two_100_200,5.0,intensive,100,1.18,1.055,0.84,0.4518130433065305,0.46213348765432727,0.46213348765432727,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.015036095571658826,0,0,0,0,0 +230_1000,two_100_200,15.0,soft,100,1.18,1.055,0.155,4.705471053143637,5.067569444444445,5.067569444444448,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.0031850132850248136,0,0,0,0,0 +230_1000,two_100_200,15.0,nominal,100,1.18,1.055,0.305,3.436310577691097,3.5846296296296316,3.5846296296296316,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.0058862206119172766,0,0,0,0,0 +230_1000,two_100_200,15.0,intensive,100,1.18,1.055,0.465,2.6603070995710585,2.84253472222224,2.84253472222224,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.008118542874397353,0,0,0,0,0 +230_1000,two_100_200,25.0,soft,100,1.18,1.055,0.04,11.541212872342115,13.269729938271656,13.269729938271666,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.000927293880837808,0,0,0,0,0 +230_1000,two_100_200,25.0,nominal,100,1.18,1.055,0.14,8.241037853319801,9.191625514403313,9.191625514403313,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.0027635002683849916,0,0,0,0,0 +230_1000,two_100_200,25.0,intensive,100,1.18,1.055,0.235,6.3993184974972435,7.151948302469236,7.151948302469236,6546.921739131583,0.0018668463768103565,0.01927247826086914,0.004481657487923549,0,0,0,0,0 +230_1000,two_150_250,5.0,soft,100,1.11,1.035,0.515,0.7850142426362475,0.792878086419762,0.7928780864197762,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.010257971578100444,0,0,0,0,0 +230_1000,two_150_250,5.0,nominal,100,1.11,1.035,0.695,0.6122226231449572,0.619094650205767,0.619094650205767,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.012759076704240575,0,0,0,0,0 +230_1000,two_150_250,5.0,intensive,100,1.11,1.035,0.785,0.5250754956210629,0.5315779320987701,0.5315779320987701,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.014309006803542855,0,0,0,0,0 +230_1000,two_150_250,15.0,soft,100,1.11,1.035,0.155,4.922163862867796,5.275902777777787,5.275902777777787,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.00303917995169148,0,0,0,0,0 +230_1000,two_150_250,15.0,nominal,100,1.11,1.035,0.285,3.6331379355175906,3.7929629629629744,3.7929629629629744,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.005610308212561334,0,0,0,0,0 +230_1000,two_150_250,15.0,intensive,100,1.11,1.035,0.425,2.917129852120053,3.0508680555555685,3.0508680555555685,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.007706249758455248,0,0,0,0,0 +230_1000,two_150_250,25.0,soft,100,1.11,1.035,0.04,11.95134587354983,13.616952160493838,13.616952160493838,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.0008814605475044744,0,0,0,0,0 +230_1000,two_150_250,25.0,nominal,100,1.11,1.035,0.14,8.586991691599083,9.538847736625598,9.538847736625598,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.0026329447128294347,0,0,0,0,0 +230_1000,two_150_250,25.0,intensive,100,1.11,1.035,0.215,6.82599142715461,7.499170524691408,7.499170524691408,6546.921739131583,0.0017734275362311883,0.018404613043477867,0.004274451570049115,0,0,0,0,0 +230_1000,two_200_300,5.0,soft,100,1.055,1.005,0.505,0.854351648226411,0.8623225308642049,0.8623225308642049,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.009819934057971614,0,0,0,0,0 +230_1000,two_200_300,5.0,nominal,100,1.055,1.005,0.645,0.6816776693066586,0.6885390946502099,0.6885390946502099,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.01215700429414931,0,0,0,0,0 +230_1000,two_200_300,5.0,intensive,100,1.055,1.005,0.735,0.5949706237631145,0.601022376543213,0.601022376543213,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.013612274959742517,0,0,0,0,0 +230_1000,two_200_300,15.0,soft,100,1.055,1.005,0.15,5.129177357974677,5.484236111111116,5.484236111111116,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.002890074396135932,0,0,0,0,0 +230_1000,two_200_300,15.0,nominal,100,1.055,1.005,0.275,3.835264339438348,4.001296296296303,4.001296296296303,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.005357093075685281,0,0,0,0,0 +230_1000,two_200_300,15.0,intensive,100,1.055,1.005,0.385,3.1083953483940356,3.2592013888889255,3.2592013888889255,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.007321664492754724,0,0,0,0,0 +230_1000,two_200_300,25.0,soft,100,1.055,1.005,0.04,12.367416374757568,13.964174382716067,13.964174382716067,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.000835627214171143,0,0,0,0,0 +230_1000,two_200_300,25.0,nominal,100,1.055,1.005,0.14,8.935386006068818,9.88606995884777,9.88606995884777,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.002502389157273884,0,0,0,0,0 +230_1000,two_200_300,25.0,intensive,100,1.055,1.005,0.205,7.126910312191698,7.84639274691358,7.846392746913581,6546.921739131583,0.0017156637681158893,0.017556814492753252,0.004077339090177937,0,0,0,0,0 diff --git a/data/processed/lab039/lab039_tradeoff.png b/data/processed/lab039/lab039_tradeoff.png new file mode 100644 index 0000000..3796ed6 Binary files /dev/null and b/data/processed/lab039/lab039_tradeoff.png differ diff --git a/data/processed/lab039/lab039_watchdog_metrics.csv b/data/processed/lab039/lab039_watchdog_metrics.csv new file mode 100644 index 0000000..0a8e233 --- /dev/null +++ b/data/processed/lab039/lab039_watchdog_metrics.csv @@ -0,0 +1,181 @@ +channel_condition,policy,initial_speed_kmh,deceleration_profile,repetitions,communication_gaps_mean,gaps_over_first_mean,gaps_over_second_mean,stage1_transitions_mean,stage2_transitions_mean,recovered_before_first_mean,recovered_between_thresholds_mean,recovered_after_second_mean,max_command_gap_ms,preliminary_reactions_per_minute,mandatory_brakings_per_minute,full_stops_per_minute,stage1_time_fraction,stage2_time_fraction,zero_speed_fraction,mean_short_speed_reduction_mps,mean_resume_time_seconds,short_outage_full_stops_mean +no_loss,single_250,5.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,5.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,5.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,15.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,15.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,15.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,25.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,25.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,single_250,25.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,5.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,5.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,5.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,15.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,15.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,15.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,25.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,25.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_100_200,25.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,5.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,5.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,5.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,15.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,15.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,15.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,25.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,25.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_150_250,25.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,5.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,5.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,5.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,15.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,15.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,15.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,25.0,soft,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,25.0,nominal,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +no_loss,two_200_300,25.0,intensive,1,1031.0,0.0,0.0,0.0,0.0,1031.0,0.0,0.0,66.0800000000279,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +300_50,single_250,5.0,soft,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.06506555722222106,0.0 +300_50,single_250,5.0,nominal,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.09691380249999834,0.0 +300_50,single_250,5.0,intensive,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.005,0.0,0.0004549733611111169,5.471509259258702e-06,0.0,0.1301170699999978,0.0 +300_50,single_250,15.0,soft,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.06506555722222107,0.0 +300_50,single_250,15.0,nominal,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.09691380249999834,0.0 +300_50,single_250,15.0,intensive,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.13013111444444214,0.0 +300_50,single_250,25.0,soft,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.06506555722222107,0.0 +300_50,single_250,25.0,nominal,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.09691380249999834,0.0 +300_50,single_250,25.0,intensive,100,1026.26,1.13,1.13,0.0,1.13,1025.11,0.0,1.13,597.5733333333295,0.0,0.565,0.0,0.0,0.0004549733611111169,0.0,0.0,0.13013111444444214,0.0 +300_50,two_100_200,5.0,soft,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.014417271870243338,0.031096147997843583,0.0 +300_50,two_100_200,5.0,nominal,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.028652684193582724,0.05571917866378729,0.0 +300_50,two_100_200,5.0,intensive,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.005,0.0072607061111124895,0.0011692007499999651,1.2763175925925178e-05,0.04276099803769319,0.07963701855374762,0.0 +300_50,two_100_200,15.0,soft,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.014417271870243338,0.031096147997843594,0.0 +300_50,two_100_200,15.0,nominal,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.028652684193582724,0.05571917866378729,0.0 +300_50,two_100_200,15.0,intensive,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.04276099803769319,0.07978980309481042,0.0 +300_50,two_100_200,25.0,soft,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.014417271870243333,0.03109614799784359,0.0 +300_50,two_100_200,25.0,nominal,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.028652684193582724,0.05571917866378727,0.0 +300_50,two_100_200,25.0,intensive,100,1026.26,22.77,2.94,22.77,2.94,1003.47,19.83,2.94,597.5733333333295,11.385,1.47,0.0,0.0072607061111124895,0.0011692007499999651,0.0,0.04276099803769319,0.07978980309481042,0.0 +300_50,two_150_250,5.0,soft,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.014200534533562363,0.032104475073990765,0.0 +300_50,two_150_250,5.0,nominal,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.028363264195329852,0.05778611869118251,0.0 +300_50,two_150_250,5.0,intensive,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.005,0.0026701592222223226,0.0004549733611111169,8.596509259258746e-06,0.04233880094833935,0.0812690980872204,0.0 +300_50,two_150_250,15.0,soft,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.014200534533562369,0.032104475073990765,0.0 +300_50,two_150_250,15.0,nominal,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.02836326419532985,0.0577861186911825,0.0 +300_50,two_150_250,15.0,intensive,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.042338800948339333,0.08148539015071245,0.0 +300_50,two_150_250,25.0,soft,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.014200534533562363,0.03210447507399076,0.0 +300_50,two_150_250,25.0,nominal,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.02836326419532985,0.05778611869118252,0.0 +300_50,two_150_250,25.0,intensive,100,1026.26,8.42,1.13,8.42,1.13,1017.82,7.29,1.13,597.5733333333295,4.21,0.565,0.0,0.0026701592222223226,0.0004549733611111169,0.0,0.04233880094833935,0.08148539015071245,0.0 +300_50,two_200_300,5.0,soft,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.01440103622222236,0.03324268298412735,0.0 +300_50,two_200_300,5.0,nominal,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.028802072444444722,0.05966895562698424,0.0 +300_50,two_200_300,5.0,intensive,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.04318150666666711,0.08609522826984115,0.0 +300_50,two_200_300,15.0,soft,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.014401036222222368,0.03324268298412735,0.0 +300_50,two_200_300,15.0,nominal,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.02880207244444472,0.059668955626984245,0.0 +300_50,two_200_300,15.0,intensive,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.043181506666667105,0.08609522826984113,0.0 +300_50,two_200_300,25.0,soft,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.014401036222222354,0.03324268298412735,0.0 +300_50,two_200_300,25.0,nominal,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.02880207244444472,0.05966895562698423,0.0 +300_50,two_200_300,25.0,intensive,100,1026.26,2.94,0.41,2.94,0.41,1023.3,2.53,0.41,597.5733333333295,1.47,0.205,0.0,0.0009794275277777414,0.00018977322222222385,0.0,0.04318150666666712,0.08609522826984117,0.0 +260_200,single_250,5.0,soft,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.11,0.0,0.008047035814101813,0.00045221060042689417,0.0,0.405186909137988,0.0 +260_200,single_250,5.0,nominal,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.26,0.0,0.008047035814101813,0.0012010270933040664,0.0,0.5526797746222156,0.0 +260_200,single_250,5.0,intensive,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.45,0.0,0.008047035814101813,0.0020279770498569305,0.0,0.6674171381769596,0.0 +260_200,single_250,15.0,soft,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.0,0.0,0.008047035814101813,0.0,0.0,0.4282289967685457,0.0 +260_200,single_250,15.0,nominal,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.0,0.0,0.008047035814101813,0.0,0.0,0.6429113600209527,0.0 +260_200,single_250,15.0,intensive,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.015,0.0,0.008047035814101813,5.860833333324765e-05,0.0,0.8502538152839292,0.0 +260_200,single_250,25.0,soft,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.0,0.0,0.008047035814101813,0.0,0.0,0.4282289967685457,0.0 +260_200,single_250,25.0,nominal,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.0,0.0,0.008047035814101813,0.0,0.0,0.6429113600209527,0.0 +260_200,single_250,25.0,intensive,100,1192.61,4.68,4.68,0.0,4.68,1187.91,0.0,4.67,1553.3846153846298,0.0,2.34,0.0,0.0,0.008047035814101813,0.0,0.0,0.8552058010389076,0.0 +260_200,two_100_200,5.0,soft,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.125,0.0061662966923077675,0.010199767410255816,0.0006257084636746991,0.024634807305857206,0.30130497486593477,0.0 +260_200,two_100_200,5.0,nominal,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.4,0.0061662966923077675,0.010199767410255816,0.0017914852129624007,0.04926961461171441,0.43469018657387953,0.0 +260_200,two_100_200,5.0,intensive,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.66,0.0061662966923077675,0.010199767410255816,0.0029912988725062117,0.07361396037911004,0.5402697089026393,0.0 +260_200,two_100_200,15.0,soft,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.0,0.0061662966923077675,0.010199767410255816,0.0,0.0246348073058572,0.3123187025373716,0.0 +260_200,two_100_200,15.0,nominal,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.0,0.0061662966923077675,0.010199767410255816,0.0,0.04886294794504953,0.49030457888916096,0.0 +260_200,two_100_200,15.0,intensive,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.03,0.0061662966923077675,0.010199767410255816,0.00011300018589728251,0.07210748174665038,0.6633671090241648,0.0 +260_200,two_100_200,25.0,soft,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.0,0.0061662966923077675,0.010199767410255816,0.0,0.02463480730585721,0.3123187025373716,0.0 +260_200,two_100_200,25.0,nominal,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.0,0.0061662966923077675,0.010199767410255816,0.0,0.04886294794504952,0.49030457888916096,0.0 +260_200,two_100_200,25.0,intensive,100,1192.61,8.93,5.86,8.93,5.86,1183.68,3.06,5.84,1553.3846153846298,4.465,2.93,0.0,0.0061662966923077675,0.010199767410255816,0.0,0.07180303730218794,0.6633664679884888,0.0 +260_200,two_150_250,5.0,soft,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.12,0.004874652275641122,0.008047035814101813,0.0005152519109681763,0.017900799763732943,0.28698517671815543,0.0 +260_200,two_150_250,5.0,nominal,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.325,0.004874652275641122,0.008047035814101813,0.0014273649850418452,0.03580159952746589,0.4121410657265168,0.0 +260_200,two_150_250,5.0,intensive,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.495,0.004874652275641122,0.008047035814101813,0.0023632394985747623,0.05370239929119883,0.5127262510379955,0.0 +260_200,two_150_250,15.0,soft,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.0,0.004874652275641122,0.008047035814101813,0.0,0.017831799763732944,0.2963265958660866,0.0 +260_200,two_150_250,15.0,nominal,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.0,0.004874652275641122,0.008047035814101813,0.0,0.03553964568131214,0.46284539445040485,0.0 +260_200,two_150_250,15.0,intensive,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.02,0.004874652275641122,0.008047035814101813,7.686239316227155e-05,0.05313334886386748,0.628528777542409,0.0 +260_200,two_150_250,25.0,soft,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.0,0.004874652275641122,0.008047035814101813,0.0,0.017831799763732944,0.2963265958660866,0.0 +260_200,two_150_250,25.0,nominal,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.0,0.004874652275641122,0.008047035814101813,0.0,0.03553964568131214,0.46284539445040485,0.0 +260_200,two_150_250,25.0,intensive,100,1192.61,7.54,4.68,7.54,4.68,1185.07,2.84,4.67,1553.3846153846298,3.77,2.34,0.0,0.004874652275641122,0.008047035814101813,0.0,0.05292500698350795,0.626409350849427,0.0 +260_200,two_200_300,5.0,soft,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.095,0.003856901653846757,0.006342865756409058,0.00039858852065484315,0.01920227653114614,0.29642266623185815,0.0 +260_200,two_200_300,5.0,nominal,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.26,0.003856901653846757,0.006342865756409058,0.0011301937599707363,0.03832860767767682,0.4228827529073018,0.0 +260_200,two_200_300,5.0,intensive,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.4,0.003856901653846757,0.006342865756409058,0.0019008925491447405,0.05749291151651522,0.522057118948683,0.0 +260_200,two_200_300,15.0,soft,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.0,0.003856901653846757,0.006342865756409058,0.0,0.019189276531146156,0.30361203067391107,0.0 +260_200,two_200_300,15.0,nominal,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.0,0.003856901653846757,0.006342865756409058,0.0,0.038302607677676834,0.4811089773983916,0.0 +260_200,two_200_300,15.0,intensive,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.015,0.003856901653846757,0.006342865756409058,5.548333333324783e-05,0.05745391151651526,0.652519273597819,0.0 +260_200,two_200_300,25.0,soft,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.0,0.003856901653846757,0.006342865756409058,0.0,0.01918927653114615,0.30361203067391107,0.0 +260_200,two_200_300,25.0,nominal,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.0,0.003856901653846757,0.006342865756409058,0.0,0.03830260767767684,0.48110897739839165,0.0 +260_200,two_200_300,25.0,intensive,100,1192.61,5.86,3.65,5.86,3.65,1186.74,2.19,3.65,1553.3846153846298,2.93,1.825,0.0,0.003856901653846757,0.006342865756409058,0.0,0.05745391151651526,0.6560566129917526,0.0 +230_200,single_250,5.0,soft,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.1,0.0,0.008226305797102696,0.000514733896940646,0.0,0.4058671258799739,0.0 +230_200,single_250,5.0,nominal,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.26,0.0,0.008226305797102696,0.0012808948470213028,0.0,0.5623441785139918,0.0 +230_200,single_250,5.0,intensive,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.46,0.0,0.008226305797102696,0.002076788405797635,0.0,0.6860111928227198,0.0 +230_200,single_250,15.0,soft,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.0,0.0,0.008226305797102696,0.0,0.0,0.42339743892346277,0.0 +230_200,single_250,15.0,nominal,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.01,0.0,0.008226305797102696,5.119388083742042e-05,0.0,0.6249763505867079,0.0 +230_200,single_250,15.0,intensive,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.02,0.0,0.008226305797102696,0.0001472850241546552,0.0,0.8339532523120714,0.0 +230_200,single_250,25.0,soft,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.0,0.0,0.008226305797102696,0.0,0.0,0.42339743892346277,0.0 +230_200,single_250,25.0,nominal,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.0,0.0,0.008226305797102696,0.0,0.0,0.6275253747413009,0.0 +230_200,single_250,25.0,intensive,100,750.6,4.63,4.63,0.0,4.63,745.94,0.0,4.63,1938.2260869568952,0.0,2.315,0.0,0.0,0.008226305797102696,0.0,0.0,0.8442720349207719,0.0 +230_200,two_100_200,5.0,soft,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.115,0.006404715942029555,0.010383782608696294,0.0006719713365541712,0.021344368184960293,0.28906947513658543,0.0 +230_200,two_100_200,5.0,nominal,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.365,0.006404715942029555,0.010383782608696294,0.0018144038647347485,0.04144028378192868,0.41632392119614,0.0 +230_200,two_100_200,5.0,intensive,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.655,0.006404715942029555,0.010383782608696294,0.0030680473027381683,0.06172692132506846,0.5218387776162401,0.04 +230_200,two_100_200,15.0,soft,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.0,0.006404715942029555,0.010383782608696294,0.0,0.021344368184960286,0.29998906917508,0.0 +230_200,two_100_200,15.0,nominal,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.015,0.006404715942029555,0.010383782608696294,7.693719806769252e-05,0.04144028378192868,0.4633225875050784,0.0 +230_200,two_100_200,15.0,intensive,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.035,0.006404715942029555,0.010383782608696294,0.00019270567632860566,0.06169593098690283,0.6294164207747263,0.0 +230_200,two_100_200,25.0,soft,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.0,0.006404715942029555,0.010383782608696294,0.0,0.021344368184960293,0.29998906917508,0.0 +230_200,two_100_200,25.0,nominal,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.0,0.006404715942029555,0.010383782608696294,0.0,0.04144028378192868,0.4650197960839407,0.0 +230_200,two_100_200,25.0,intensive,100,750.6,9.62,5.99,9.62,5.99,740.96,3.63,5.98,1938.2260869568952,4.81,2.995,0.005,0.006404715942029555,0.010383782608696294,7.23747987120719e-06,0.061695930986902826,0.6316911802181836,0.0 +230_200,two_150_250,5.0,soft,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.1,0.005001884057970516,0.008226305797102696,0.0005626505636073119,0.020918718288478595,0.28032244045139837,0.0 +230_200,two_150_250,5.0,nominal,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.29,0.005001884057970516,0.008226305797102696,0.001466152012882828,0.041635349620435885,0.4057408181659914,0.0 +230_200,two_150_250,5.0,intensive,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.505,0.005001884057970516,0.008226305797102696,0.0024288750000005677,0.061517836853014034,0.5056465925162827,0.0 +230_200,two_150_250,15.0,soft,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.0,0.005001884057970516,0.008226305797102696,0.0,0.02091871828847859,0.29250437847832683,0.0 +230_200,two_150_250,15.0,nominal,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.015,0.005001884057970516,0.008226305797102696,6.443719806769294e-05,0.04163534962043587,0.4515614131862308,0.0 +230_200,two_150_250,15.0,intensive,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.025,0.005001884057970516,0.008226305797102696,0.0001631696859904028,0.06151783685301404,0.6129476596521051,0.0 +230_200,two_150_250,25.0,soft,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.0,0.005001884057970516,0.008226305797102696,0.0,0.020918718288478598,0.2925043784783269,0.0 +230_200,two_150_250,25.0,nominal,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.0,0.005001884057970516,0.008226305797102696,0.0,0.041635349620435885,0.45317598617910126,0.0 +230_200,two_150_250,25.0,intensive,100,750.6,7.71,4.63,7.71,4.63,742.87,3.07,4.63,1938.2260869568952,3.855,2.315,0.0,0.005001884057970516,0.008226305797102696,0.0,0.06110296728779641,0.6140984941701649,0.0 +230_200,two_200_300,5.0,soft,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.085,0.0038694840579704625,0.0065142985507258356,0.0004640957326893967,0.018976081159426023,0.28449686514284583,0.0 +230_200,two_200_300,5.0,nominal,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.255,0.0038694840579704625,0.0065142985507258356,0.0012076871712295588,0.037589814492765244,0.41182037397444454,0.0 +230_200,two_200_300,5.0,intensive,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.395,0.0038694840579704625,0.0065142985507258356,0.0019341896135270343,0.05638472173914786,0.5149817125297816,0.0 +230_200,two_200_300,15.0,soft,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.0,0.0038694840579704625,0.0065142985507258356,0.0,0.018976081159426023,0.2964985050631034,0.0 +230_200,two_200_300,15.0,nominal,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.01,0.0038694840579704625,0.0065142985507258356,4.8416103059642795e-05,0.037589814492765244,0.45541800092024814,0.0 +230_200,two_200_300,15.0,intensive,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.015,0.0038694840579704625,0.0065142985507258356,0.0001397844202899152,0.05618254782610439,0.6200797295607158,0.0 +230_200,two_200_300,25.0,soft,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.0,0.0038694840579704625,0.0065142985507258356,0.0,0.018976081159426023,0.2964985050631034,0.0 +230_200,two_200_300,25.0,nominal,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.0,0.0038694840579704625,0.0065142985507258356,0.0,0.037589814492765244,0.4571240186336163,0.0 +230_200,two_200_300,25.0,intensive,100,750.6,5.99,3.73,5.99,3.73,744.59,2.25,3.73,1938.2260869568952,2.995,1.865,0.0,0.0038694840579704625,0.0065142985507258356,0.0,0.05605889565219118,0.6220896579021029,0.0 +230_1000,single_250,5.0,soft,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.51,0.0,0.018404613043477867,0.010031135426731688,0.0,0.8957060731079274,0.0 +230_1000,single_250,5.0,nominal,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.655,0.0,0.018404613043477867,0.012342763123993643,0.0,1.0144163252818321,0.0 +230_1000,single_250,5.0,intensive,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.76,0.0,0.018404613043477867,0.013786482729468781,0.0,1.0761551423510674,0.0 +230_1000,single_250,15.0,soft,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.155,0.0,0.018404613043477867,0.0029537632850248157,0.0,1.5966444946860836,0.0 +230_1000,single_250,15.0,nominal,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.28,0.0,0.018404613043477867,0.005433619484703018,0.0,2.0011169777778726,0.0 +230_1000,single_250,15.0,intensive,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.405,0.0,0.018404613043477867,0.007416253864735419,0.0,2.28394553429962,0.0 +230_1000,single_250,25.0,soft,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.04,0.0,0.018404613043477867,0.0008522938808378088,0.0,1.730301442834255,0.0 +230_1000,single_250,25.0,nominal,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.14,0.0,0.018404613043477867,0.0025385002683849934,0.0,2.350818305958271,0.0 +230_1000,single_250,25.0,intensive,100,744.77,2.07,2.07,0.0,2.07,742.68,0.0,2.04,6546.921739131583,0.0,1.035,0.215,0.0,0.018404613043477867,0.0041265349033824525,0.0,2.8429446022545797,0.0 +230_1000,two_100_200,5.0,soft,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.55,0.0018668463768103565,0.01927247826086914,0.010741405072464415,0.004593391304349055,0.9027727916264401,0.0 +230_1000,two_100_200,5.0,nominal,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.725,0.0018668463768103565,0.01927247826086914,0.013386441116478949,0.00918678260869811,1.017165312721432,0.0 +230_1000,two_100_200,5.0,intensive,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.84,0.0018668463768103565,0.01927247826086914,0.015036095571658826,0.013780173913047165,1.0683309713365683,0.02 +230_1000,two_100_200,15.0,soft,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.155,0.0018668463768103565,0.01927247826086914,0.0031850132850248136,0.004593391304349055,1.622684428985595,0.0 +230_1000,two_100_200,15.0,nominal,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.305,0.0018668463768103565,0.01927247826086914,0.0058862206119172766,0.00918678260869811,2.0541545294686796,0.0 +230_1000,two_100_200,15.0,intensive,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.465,0.0018668463768103565,0.01927247826086914,0.008118542874397353,0.013780173913047165,2.350325549758532,0.02 +230_1000,two_100_200,25.0,soft,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.04,0.0018668463768103565,0.01927247826086914,0.000927293880837808,0.004593391304349055,1.7645571178745068,0.0 +230_1000,two_100_200,25.0,nominal,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.14,0.0018668463768103565,0.01927247826086914,0.0027635002683849916,0.00918678260869811,2.4189631742352375,0.0 +230_1000,two_100_200,25.0,intensive,100,744.77,2.36,2.11,2.36,2.11,742.41,0.23,2.08,6546.921739131583,1.18,1.055,0.235,0.0018668463768103565,0.01927247826086914,0.004481657487923549,0.013780173913047165,2.937029966505776,0.01 +230_1000,two_150_250,5.0,soft,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.515,0.0017734275362311883,0.018404613043477867,0.010257971578100444,0.0024442608695661107,0.882209267149793,0.0 +230_1000,two_150_250,5.0,nominal,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.695,0.0017734275362311883,0.018404613043477867,0.012759076704240575,0.004888521739132221,0.9986868933977697,0.0 +230_1000,two_150_250,5.0,intensive,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.785,0.0017734275362311883,0.018404613043477867,0.014309006803542855,0.007332782608698332,1.0576576520128982,0.0 +230_1000,two_150_250,15.0,soft,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.155,0.0017734275362311883,0.018404613043477867,0.00303917995169148,0.002444260869566115,1.5812438618358384,0.0 +230_1000,two_150_250,15.0,nominal,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.285,0.0017734275362311883,0.018404613043477867,0.005610308212561334,0.004888521739132221,1.99140453333342,0.0 +230_1000,two_150_250,15.0,intensive,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.425,0.0017734275362311883,0.018404613043477867,0.007706249758455248,0.007332782608698327,2.2934626850242505,0.0 +230_1000,two_150_250,25.0,soft,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.04,0.0017734275362311883,0.018404613043477867,0.0008814605475044744,0.002444260869566106,1.7165961803543803,0.0 +230_1000,two_150_250,25.0,nominal,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.14,0.0017734275362311883,0.018404613043477867,0.0026329447128294347,0.004888521739132221,2.342472927536366,0.0 +230_1000,two_150_250,25.0,intensive,100,744.77,2.22,2.07,2.22,2.07,742.54,0.14,2.04,6546.921739131583,1.11,1.035,0.215,0.0017734275362311883,0.018404613043477867,0.004274451570049115,0.007332782608698336,2.8563816524961214,0.0 +230_1000,two_200_300,5.0,soft,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.505,0.0017156637681158893,0.017556814492753252,0.009819934057971614,0.002439826086957564,0.8633734144927905,0.0 +230_1000,two_200_300,5.0,nominal,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.645,0.0017156637681158893,0.017556814492753252,0.01215700429414931,0.004879652173915128,0.9835612618357763,0.0 +230_1000,two_200_300,5.0,intensive,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.735,0.0017156637681158893,0.017556814492753252,0.013612274959742517,0.007319478260872691,1.0464980843800533,0.0 +230_1000,two_200_300,15.0,soft,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.15,0.0017156637681158893,0.017556814492753252,0.002890074396135932,0.0024398260869575683,1.550820280193329,0.0 +230_1000,two_200_300,15.0,nominal,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.275,0.0017156637681158893,0.017556814492753252,0.005357093075685281,0.004879652173915128,1.9471083980677353,0.0 +230_1000,two_200_300,15.0,intensive,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.385,0.0017156637681158893,0.017556814492753252,0.007321664492754724,0.007319478260872687,2.241636423188508,0.0 +230_1000,two_200_300,25.0,soft,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.04,0.0017156637681158893,0.017556814492753252,0.000835627214171143,0.0024398260869575596,1.6797259790661383,0.0 +230_1000,two_200_300,25.0,nominal,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.14,0.0017156637681158893,0.017556814492753252,0.002502389157273884,0.004879652173915128,2.291977262480009,0.0 +230_1000,two_200_300,25.0,intensive,100,744.77,2.11,2.01,2.11,2.01,742.64,0.1,1.98,6546.921739131583,1.055,1.005,0.205,0.0017156637681158893,0.017556814492753252,0.004077339090177937,0.007319478260872696,2.793908148148299,0.0 diff --git a/protocol/two_stage_failsafe.py b/protocol/two_stage_failsafe.py new file mode 100644 index 0000000..8429bea --- /dev/null +++ b/protocol/two_stage_failsafe.py @@ -0,0 +1,229 @@ +"""Event-driven two-stage longitudinal failsafe model for Lab039. + +The module is intentionally independent from motor hardware. It models an +explicit safety state machine and exact one-dimensional constant-acceleration +segments; measured rover braking parameters are still required before any +real-world use. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from enum import Enum + + +class SafetyState(str, Enum): + NORMAL = "normal" + STAGE1_DECELERATION = "stage1_deceleration" + STAGE2_BRAKING = "stage2_braking" + EMERGENCY_LATCHED = "emergency_latched" + + +@dataclass(frozen=True) +class ThresholdPolicy: + name: str + stage1_seconds: float | None + stage2_seconds: float + + def __post_init__(self) -> None: + if self.stage2_seconds <= 0.0: + raise ValueError("stage2_seconds must be positive") + if self.stage1_seconds is not None: + if self.stage1_seconds <= 0.0: + raise ValueError("stage1_seconds must be positive") + if self.stage1_seconds >= self.stage2_seconds: + raise ValueError("stage1 threshold must precede stage2") + + +@dataclass(frozen=True) +class DecelerationProfile: + name: str + stage1_mps2: float + stage2_mps2: float + + def __post_init__(self) -> None: + if self.stage1_mps2 <= 0.0 or self.stage2_mps2 <= 0.0: + raise ValueError("decelerations must be positive") + + +@dataclass(frozen=True) +class KinematicStep: + final_speed_mps: float + distance_m: float + zero_after_seconds: float | None + target_after_seconds: float | None + + +@dataclass(frozen=True) +class ForcedStopResult: + speed_at_first_threshold_mps: float + speed_at_second_threshold_mps: float + distance_to_first_threshold_m: float + distance_between_thresholds_m: float + braking_distance_m: float + total_distance_m: float + stop_time_seconds: float + + +def integrate_kinematics( + speed_mps: float, + acceleration_mps2: float, + duration_seconds: float, + *, + target_speed_mps: float | None = None, +) -> KinematicStep: + """Integrate one constant-acceleration segment exactly. + + Braking is truncated at zero speed. Positive acceleration can optionally + be truncated at ``target_speed_mps``. Distance after either bound is + reached uses the corresponding constant bounded speed. + """ + + if speed_mps < 0.0: + raise ValueError("speed must not be negative") + if duration_seconds < 0.0: + raise ValueError("duration must not be negative") + if target_speed_mps is not None and target_speed_mps < 0.0: + raise ValueError("target speed must not be negative") + if duration_seconds == 0.0: + return KinematicStep(speed_mps, 0.0, None, None) + if acceleration_mps2 < 0.0: + if speed_mps == 0.0: + return KinematicStep(0.0, 0.0, 0.0, None) + stop_after = speed_mps / -acceleration_mps2 + moving_time = min(duration_seconds, stop_after) + distance = speed_mps * moving_time + 0.5 * acceleration_mps2 * moving_time * moving_time + if stop_after <= duration_seconds: + return KinematicStep(0.0, max(0.0, distance), stop_after, None) + final_speed = speed_mps + acceleration_mps2 * duration_seconds + return KinematicStep(max(0.0, final_speed), max(0.0, distance), None, None) + if acceleration_mps2 > 0.0 and target_speed_mps is not None: + if speed_mps > target_speed_mps + 1e-12: + raise ValueError("speed already exceeds target") + if speed_mps >= target_speed_mps - 1e-12: + return KinematicStep(target_speed_mps, target_speed_mps * duration_seconds, None, 0.0) + target_after = (target_speed_mps - speed_mps) / acceleration_mps2 + accelerating_time = min(duration_seconds, target_after) + distance = speed_mps * accelerating_time + 0.5 * acceleration_mps2 * accelerating_time * accelerating_time + if target_after <= duration_seconds: + distance += target_speed_mps * (duration_seconds - target_after) + return KinematicStep(target_speed_mps, distance, None, target_after) + return KinematicStep( + speed_mps + acceleration_mps2 * duration_seconds, + distance, + None, + None, + ) + final_speed = speed_mps + acceleration_mps2 * duration_seconds + if final_speed < -1e-12: + raise ValueError("unbounded integration produced negative speed") + distance = speed_mps * duration_seconds + 0.5 * acceleration_mps2 * duration_seconds * duration_seconds + return KinematicStep(max(0.0, final_speed), max(0.0, distance), None, None) + + +class TwoStageFailsafe: + """Sequence-aware watchdog FSM with a latched emergency state. + + At an equal timestamp the caller must pass a completely received fresh + command to :meth:`receive_command` before calling :meth:`apply_watchdog`. + The fresh command then updates the watchdog origin and prevents a stage-1 + or stage-2 transition based on the previous command. Lab039's event + scheduler implements and tests this receive-before-threshold rule. + """ + + def __init__( + self, + policy: ThresholdPolicy, + profile: DecelerationProfile, + *, + resume_acceleration_mps2: float = 1.0, + boot_time_seconds: float = 0.0, + ) -> None: + if resume_acceleration_mps2 <= 0.0: + raise ValueError("resume acceleration must be positive") + self.policy = policy + self.profile = profile + self.resume_acceleration_mps2 = resume_acceleration_mps2 + self.state = SafetyState.NORMAL + self.last_sequence = -1 + self.last_fresh_time_seconds = boot_time_seconds + self.emergency_actions = 0 + self.emergency_duplicates = 0 + self._emergency_keys: set[tuple[int, int]] = set() + + def receive_command(self, sequence_number: int, receive_time_seconds: float) -> bool: + if sequence_number <= self.last_sequence: + return False + if receive_time_seconds < self.last_fresh_time_seconds: + raise ValueError("receive time moved backwards") + self.last_sequence = sequence_number + self.last_fresh_time_seconds = receive_time_seconds + if self.state is not SafetyState.EMERGENCY_LATCHED: + self.state = SafetyState.NORMAL + return True + + def apply_watchdog(self, now_seconds: float) -> SafetyState: + if now_seconds < self.last_fresh_time_seconds: + raise ValueError("watchdog time moved backwards") + if self.state is SafetyState.EMERGENCY_LATCHED: + return self.state + age = now_seconds - self.last_fresh_time_seconds + if age >= self.policy.stage2_seconds - 1e-12: + self.state = SafetyState.STAGE2_BRAKING + elif self.policy.stage1_seconds is not None and age >= self.policy.stage1_seconds - 1e-12: + self.state = SafetyState.STAGE1_DECELERATION + return self.state + + def receive_emergency(self, stream_id: int, sequence_number: int) -> bool: + key = stream_id, sequence_number + if key in self._emergency_keys: + self.emergency_duplicates += 1 + return False + self._emergency_keys.add(key) + self.emergency_actions += 1 + self.state = SafetyState.EMERGENCY_LATCHED + return True + + def acceleration_mps2(self, speed_mps: float, target_speed_mps: float) -> float: + if speed_mps < 0.0 or target_speed_mps < 0.0: + raise ValueError("speeds must not be negative") + if self.state is SafetyState.NORMAL: + return self.resume_acceleration_mps2 if speed_mps < target_speed_mps - 1e-12 else 0.0 + if self.state is SafetyState.STAGE1_DECELERATION: + return -self.profile.stage1_mps2 if speed_mps > 0.0 else 0.0 + return -self.profile.stage2_mps2 if speed_mps > 0.0 else 0.0 + + +def forced_stop( + initial_speed_mps: float, + policy: ThresholdPolicy, + profile: DecelerationProfile, +) -> ForcedStopResult: + """Exact no-recovery stop after the last fresh command at time zero.""" + + if initial_speed_mps < 0.0: + raise ValueError("initial speed must not be negative") + first_threshold = policy.stage1_seconds if policy.stage1_seconds is not None else policy.stage2_seconds + distance_to_first = initial_speed_mps * first_threshold + speed_at_first = initial_speed_mps + if policy.stage1_seconds is None: + speed_at_second = initial_speed_mps + distance_between = 0.0 + else: + stage1_duration = policy.stage2_seconds - policy.stage1_seconds + stage1 = integrate_kinematics(initial_speed_mps, -profile.stage1_mps2, stage1_duration) + speed_at_second = stage1.final_speed_mps + distance_between = stage1.distance_m + braking = integrate_kinematics(speed_at_second, -profile.stage2_mps2, speed_at_second / profile.stage2_mps2 if speed_at_second else 0.0) + stop_time = policy.stage2_seconds + speed_at_second / profile.stage2_mps2 + if speed_at_second == 0.0 and policy.stage1_seconds is not None: + stop_time = policy.stage1_seconds + initial_speed_mps / profile.stage1_mps2 + return ForcedStopResult( + speed_at_first, + speed_at_second, + distance_to_first, + distance_between, + braking.distance_m, + distance_to_first + distance_between + braking.distance_m, + stop_time, + ) diff --git a/tests/lab039_two_stage_braking.py b/tests/lab039_two_stage_braking.py new file mode 100644 index 0000000..3c6f68e --- /dev/null +++ b/tests/lab039_two_stage_braking.py @@ -0,0 +1,1890 @@ +"""Lab039: two-stage failsafe and exact longitudinal stopping distance.""" + +from __future__ import annotations + +import csv +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Iterable + +import cv2 +import matplotlib +import numpy as np + +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +from protocol.emergency_ack import EmergencyAckReceiver, build_emergency_ack +from protocol.link_packet import encode_link_packet +from protocol.two_stage_failsafe import ( + DecelerationProfile, + SafetyState, + ThresholdPolicy, + TwoStageFailsafe, + forced_stop, + integrate_kinematics, +) +from tests.lab033_priority_channel_scheduler import STREAM_EMERGENCY +from tests.lab037_lossy_full_link import bad_intervals +from tests.lab038_control_failsafe import ( + DURATION_SECONDS, + EMERGENCY_SPREAD_US, + MASTER_SEED, + Frame, + Unit, + Workload, + build_workload as build_lab038_workload, + packet_is_lost, +) + + +OUTPUT_DIRECTORY = Path("data/processed/lab039") +SUMMARY_CSV_PATH = OUTPUT_DIRECTORY / "lab039_summary.csv" +WATCHDOG_CSV_PATH = OUTPUT_DIRECTORY / "lab039_watchdog_metrics.csv" +DISTANCE_CSV_PATH = OUTPUT_DIRECTORY / "lab039_distance_metrics.csv" +EMERGENCY_CSV_PATH = OUTPUT_DIRECTORY / "lab039_emergency_stop_metrics.csv" +ANALYTIC_CSV_PATH = OUTPUT_DIRECTORY / "lab039_analytic_checks.csv" +REPORT_PATH = OUTPUT_DIRECTORY / "lab039_report.txt" +PATH_SPEED_PLOT = OUTPUT_DIRECTORY / "lab039_path_by_speed.png" +POLICY_PLOT = OUTPUT_DIRECTORY / "lab039_policy_comparison.png" +PROFILE_PLOT = OUTPUT_DIRECTORY / "lab039_deceleration_profiles.png" +REACTION_PLOT = OUTPUT_DIRECTORY / "lab039_reaction_rates.png" +STATE_TIME_PLOT = OUTPUT_DIRECTORY / "lab039_safety_state_time.png" +EMERGENCY_PATH_PLOT = OUTPUT_DIRECTORY / "lab039_emergency_path.png" +ANALYTIC_PLOT = OUTPUT_DIRECTORY / "lab039_analytic_vs_model.png" +TRADEOFF_PLOT = OUTPUT_DIRECTORY / "lab039_tradeoff.png" +PLOT_PATHS = ( + PATH_SPEED_PLOT, + POLICY_PLOT, + PROFILE_PLOT, + REACTION_PLOT, + STATE_TIME_PLOT, + EMERGENCY_PATH_PLOT, + ANALYTIC_PLOT, + TRADEOFF_PLOT, +) + +REPETITIONS = 100 +LAB039_SEED_OFFSET = 390_000_000 +RESUME_ACCELERATION_MPS2 = 1.0 +EMERGENCY_TIME_SECONDS = 60.0 +EPSILON = 1e-12 + +# Equal-time ordering is explicit and safety-oriented. A received emergency +# is handled first. A completely received fresh ordinary command is then +# handled before either watchdog threshold, so it resets the timer and cancels +# the transition based on the old command. Stage 2 precedes stage 1 only as a +# defensive ordering for coincident policy thresholds (valid policies do not +# configure them equally). +EVENT_PRIORITY = { + "emergency_formation": 0, + "emergency_receive": 0, + "receive": 1, + "stage2": 2, + "stage1": 3, + "end": 9, +} + + +@dataclass(frozen=True) +class ChannelCondition: + name: str + label: str + rate_kbps: float + mean_bad_ms: float | None + repetitions: int + + +CHANNEL_CONDITIONS = ( + ChannelCondition("no_loss", "Без потерь, 300 кбит/с", 300.0, None, 1), + ChannelCondition("300_50", "300 кбит/с, помеха 50 мс", 300.0, 50.0, REPETITIONS), + ChannelCondition("260_200", "260 кбит/с, помеха 200 мс", 260.0, 200.0, REPETITIONS), + ChannelCondition("230_200", "230 кбит/с, помеха 200 мс", 230.0, 200.0, REPETITIONS), + ChannelCondition("230_1000", "230 кбит/с, помеха 1000 мс", 230.0, 1000.0, REPETITIONS), +) + +POLICIES = ( + ThresholdPolicy("single_250", None, 0.250), + ThresholdPolicy("two_100_200", 0.100, 0.200), + ThresholdPolicy("two_150_250", 0.150, 0.250), + ThresholdPolicy("two_200_300", 0.200, 0.300), +) +POLICY_LABELS = { + "single_250": "Один порог 250 мс", + "two_100_200": "Два порога 100/200 мс", + "two_150_250": "Два порога 150/250 мс", + "two_200_300": "Два порога 200/300 мс", +} +PROFILES = ( + DecelerationProfile("soft", 0.5, 2.0), + DecelerationProfile("nominal", 1.0, 3.0), + DecelerationProfile("intensive", 1.5, 4.0), +) +PROFILE_LABELS = { + "soft": "Мягкий", + "nominal": "Номинальный", + "intensive": "Интенсивный", +} +SPEEDS_KMH = (5.0, 15.0, 25.0) + + +@dataclass(frozen=True) +class EmergencyTransport: + delivered: bool + first_receive_seconds: float | None + copies_transmitted: int + copies_lost: int + duplicate_copies: int + first_ack_seconds: float | None + acknowledgements_lost: int + acknowledgements_repeated: int + + +@dataclass(frozen=True) +class TransportTrace: + command_receives: tuple[tuple[float, int], ...] + emergency: EmergencyTransport | None + negative_time_order: int + + +@dataclass +class ActiveEvent: + last_fresh_time: float + last_fresh_speed: float + last_fresh_distance: float + first_time: float + first_speed: float + first_distance: float + second_time: float | None = None + second_speed: float | None = None + second_distance: float | None = None + min_speed: float = 0.0 + stop_time: float | None = None + stop_distance: float | None = None + + +@dataclass(frozen=True) +class ProtectionEvent: + gap_seconds: float + speed_last_fresh_mps: float + speed_first_threshold_mps: float + speed_second_threshold_mps: float + distance_to_first_threshold_m: float + distance_between_thresholds_m: float + braking_distance_m: float + total_distance_to_stop_m: float + time_to_stop_seconds: float + minimum_speed_mps: float + full_stop: bool + recovered_before_stop: bool + reached_stage2: bool + + +@dataclass(frozen=True) +class EmergencyMotion: + path_during_delivery_m: float + speed_at_receive_mps: float + braking_distance_m: float + total_path_m: float + time_to_stop_seconds: float + local_watchdog_stop: bool + + +@dataclass(frozen=True) +class MotionTrial: + communication_gaps: int + gaps_over_first: int + gaps_over_second: int + stage1_transitions: int + stage2_transitions: int + recovered_before_first: int + recovered_between_thresholds: int + recovered_after_second: int + max_command_gap_ms: float + events: tuple[ProtectionEvent, ...] + stage1_time_fraction: float + stage2_time_fraction: float + zero_speed_fraction: float + preliminary_reactions_per_minute: float + mandatory_brakings_per_minute: float + full_stops_per_minute: float + mean_short_speed_reduction_mps: float + mean_resume_time_seconds: float + short_outage_full_stops: int + negative_speed_cases: int + target_speed_exceeded_cases: int + missed_stage2_cases: int + stale_release_cases: int + ordinary_emergency_release_cases: int + emergency_motion: EmergencyMotion | None + + +@dataclass(frozen=True) +class SummaryMetrics: + channel_condition: str + policy: str + initial_speed_kmh: float + deceleration_profile: str + repetitions: int + preliminary_reactions_per_minute: float + mandatory_brakings_per_minute: float + full_stops_per_minute: float + mean_total_stop_path_m: float + p95_total_stop_path_m: float + max_total_stop_path_m: float + max_command_gap_ms: float + stage1_time_fraction: float + stage2_time_fraction: float + zero_speed_fraction: float + negative_speed_cases: int + target_speed_exceeded_cases: int + missed_stage2_cases: int + stale_command_release_cases: int + ordinary_command_emergency_release_cases: int + + +@dataclass(frozen=True) +class WatchdogMetrics: + channel_condition: str + policy: str + initial_speed_kmh: float + deceleration_profile: str + repetitions: int + communication_gaps_mean: float + gaps_over_first_mean: float + gaps_over_second_mean: float + stage1_transitions_mean: float + stage2_transitions_mean: float + recovered_before_first_mean: float + recovered_between_thresholds_mean: float + recovered_after_second_mean: float + max_command_gap_ms: float + preliminary_reactions_per_minute: float + mandatory_brakings_per_minute: float + full_stops_per_minute: float + stage1_time_fraction: float + stage2_time_fraction: float + zero_speed_fraction: float + mean_short_speed_reduction_mps: float + mean_resume_time_seconds: float + short_outage_full_stops_mean: float + + +@dataclass(frozen=True) +class DistanceMetrics: + channel_condition: str + policy: str + initial_speed_kmh: float + deceleration_profile: str + event_count: int + mean_speed_last_fresh_mps: float + p95_speed_last_fresh_mps: float + max_speed_last_fresh_mps: float + mean_speed_first_threshold_mps: float + p95_speed_first_threshold_mps: float + max_speed_first_threshold_mps: float + mean_speed_second_threshold_mps: float + p95_speed_second_threshold_mps: float + max_speed_second_threshold_mps: float + mean_distance_to_first_m: float + p95_distance_to_first_m: float + max_distance_to_first_m: float + mean_distance_between_m: float + p95_distance_between_m: float + max_distance_between_m: float + mean_distance_to_second_m: float + p95_distance_to_second_m: float + max_distance_to_second_m: float + mean_braking_distance_m: float + p95_braking_distance_m: float + max_braking_distance_m: float + mean_total_stop_path_m: float + p95_total_stop_path_m: float + max_total_stop_path_m: float + mean_time_to_stop_seconds: float + p95_time_to_stop_seconds: float + max_time_to_stop_seconds: float + mean_minimum_speed_mps: float + p95_minimum_speed_mps: float + max_minimum_speed_mps: float + full_stop_fraction: float + recovery_before_stop_fraction: float + + +@dataclass(frozen=True) +class EmergencyStopMetrics: + channel_condition: str + initial_speed_kmh: float + deceleration_profile: str + repetitions: int + delivered_fraction: float + mean_delivery_ms: float + p95_delivery_ms: float + max_delivery_ms: float + mean_path_during_delivery_m: float + mean_speed_at_receive_mps: float + mean_braking_distance_m: float + mean_total_path_m: float + p95_total_path_m: float + max_total_path_m: float + mean_time_to_stop_seconds: float + mean_copies_transmitted: float + mean_copies_lost: float + mean_ack_ms: float + acknowledgements_lost_mean: float + undelivered_by_500ms: int + local_watchdog_stage2_fraction_when_undelivered: float + local_watchdog_stop_fraction_when_undelivered: float + mean_local_watchdog_path_when_undelivered_m: float + mean_local_watchdog_stop_seconds_when_undelivered: float + + +@dataclass(frozen=True) +class AnalyticCheck: + initial_speed_kmh: float + deceleration_profile: str + single_reaction_path_m: float + single_braking_path_m: float + single_total_analytic_m: float + single_total_model_m: float + two_stage_reaction_path_m: float + two_stage_deceleration_path_m: float + two_stage_braking_path_m: float + two_stage_total_analytic_m: float + two_stage_total_model_m: float + two_stage_minus_single_m: float + maximum_absolute_error_m: float + + +@dataclass(frozen=True) +class FunctionalTestResult: + name: str + passed: bool + detail: str + + +def percentile(values: Iterable[float], q: float) -> float: + values = tuple(values) + return float(np.percentile(values, q)) if values else 0.0 + + +def _mean(values: Iterable[float]) -> float: + values = tuple(values) + return float(np.mean(values)) if values else 0.0 + + +def speed_kmh_to_mps(speed_kmh: float) -> float: + return speed_kmh / 3.6 + + +def build_static_units(workload: Workload, include_emergency: bool) -> tuple[Unit, ...]: + units: list[Unit] = list(workload.telemetry) + order = 60_000_000 + for packet in workload.controls: + units.append( + Unit( + packet, + encode_link_packet(packet), + packet.generation_time_us, + order, + 3, + "control", + ) + ) + order += 1 + if include_emergency: + packet = workload.emergencies[1] + for copy_index, offset in enumerate(EMERGENCY_SPREAD_US): + units.append( + Unit( + packet, + encode_link_packet(packet), + packet.generation_time_us + offset, + order, + 1, + "emergency", + copy_index=copy_index, + event_id=1, + ) + ) + order += 1 + return tuple(sorted(units, key=lambda item: (item.available_time_us, item.priority, item.order))) + + +def build_transport_trace( + workload: Workload, + rate_kbps: float, + bad_starts: np.ndarray, + bad_ends: np.ndarray, + *, + include_emergency: bool, +) -> TransportTrace: + static = build_static_units(workload, include_emergency) + ready: list[Unit] = [] + pending_frames: list[Frame] = [] + active: Frame | None = None + active_index = static_index = frame_index = 0 + cursor = 0.0 + dynamic_order = 70_000_000 + last_received_sequence = -1 + command_receives: list[tuple[float, int]] = [] + emergency_acknowledged = False + emergency_first: float | None = None + emergency_tx = emergency_lost = emergency_duplicates = 0 + ack_first: float | None = None + ack_lost = ack_generated = 0 + ack_sequence = 0 + ack_receiver = EmergencyAckReceiver() + negative_time_order = 0 + + def remove_ready(predicate) -> None: + ready[:] = [item for item in ready if not predicate(item)] + + def admit(now: float) -> None: + nonlocal static_index, frame_index + while static_index < len(static) and static[static_index].available_seconds <= now + EPSILON: + item = static[static_index] + static_index += 1 + if item.kind == "emergency" and emergency_acknowledged: + continue + if item.kind == "control": + sequence = item.packet.sequence_number + remove_ready(lambda old: old.kind == "control" and old.packet.sequence_number < sequence) + elif item.kind == "telemetry": + remove_ready(lambda old: old.kind == "telemetry") + ready.append(item) + while frame_index < len(workload.frames) and workload.frames[frame_index].generation_seconds <= now + EPSILON: + frame = workload.frames[frame_index] + frame_index += 1 + pending_frames[:] = [frame] + + previous_end = 0.0 + while static_index < len(static) or frame_index < len(workload.frames) or ready or pending_frames or active is not None: + if not ready and not pending_frames and active is None: + next_times = [] + if static_index < len(static): + next_times.append(static[static_index].available_seconds) + if frame_index < len(workload.frames): + next_times.append(workload.frames[frame_index].generation_seconds) + cursor = max(cursor, min(next_times)) + admit(cursor) + if ready: + unit = min(ready, key=lambda item: (item.priority, item.order)) + ready.remove(unit) + else: + if active is None and pending_frames: + active = pending_frames.pop(0) + active_index = 0 + if active is None: + continue + unit = active.packets[active_index] + start = max(cursor, unit.available_seconds) + end = start + unit.size * 8.0 / (rate_kbps * 1000.0) + if start < previous_end - EPSILON: + negative_time_order += 1 + previous_end = end + lost = packet_is_lost(start, end, bad_starts, bad_ends) + cursor = end + admit(cursor) + if unit.kind == "control" and not lost: + sequence = unit.packet.sequence_number + if sequence > last_received_sequence: + last_received_sequence = sequence + command_receives.append((end, sequence)) + elif unit.kind == "emergency": + emergency_tx += 1 + if lost: + emergency_lost += 1 + else: + if emergency_first is None: + emergency_first = end + else: + emergency_duplicates += 1 + ack_packet = build_emergency_ack(unit.packet, ack_sequence, int(round(end * 1_000_000.0))) + ack_sequence += 1 + ack_generated += 1 + ready.append( + Unit( + ack_packet, + encode_link_packet(ack_packet), + int(round(end * 1_000_000.0)), + dynamic_order, + 2, + "ack", + copy_index=ack_generated - 1, + event_id=1, + ) + ) + dynamic_order += 1 + elif unit.kind == "ack": + if lost: + ack_lost += 1 + elif ack_receiver.accept(unit.packet): + emergency_acknowledged = True + ack_first = end + remove_ready(lambda old: old.kind == "emergency") + elif unit.kind == "video": + active_index += 1 + if active is not None and active_index == len(active.packets): + active = None + active_index = 0 + emergency = None + if include_emergency: + emergency = EmergencyTransport( + emergency_first is not None, + emergency_first, + emergency_tx, + emergency_lost, + emergency_duplicates, + ack_first, + ack_lost, + max(0, ack_generated - 1), + ) + return TransportTrace(tuple(command_receives), emergency, negative_time_order) + + +def build_trace_sets(workload: Workload) -> tuple[dict[str, tuple[TransportTrace, ...]], dict[str, tuple[TransportTrace, ...]]]: + watchdog: dict[str, tuple[TransportTrace, ...]] = {} + emergency: dict[str, tuple[TransportTrace, ...]] = {} + for condition_index, condition in enumerate(CHANNEL_CONDITIONS): + watchdog_rows = [] + emergency_rows = [] + for repetition in range(condition.repetitions): + if condition.mean_bad_ms is None: + starts = ends = np.asarray([], dtype=float) + else: + seed = LAB039_SEED_OFFSET + MASTER_SEED + condition_index * 10_000 + repetition + starts, ends = bad_intervals(DURATION_SECONDS + 2.0, condition.mean_bad_ms, seed) + watchdog_rows.append( + build_transport_trace( + workload, + condition.rate_kbps, + starts, + ends, + include_emergency=False, + ) + ) + emergency_rows.append( + build_transport_trace( + workload, + condition.rate_kbps, + starts, + ends, + include_emergency=True, + ) + ) + watchdog[condition.name] = tuple(watchdog_rows) + emergency[condition.name] = tuple(emergency_rows) + print(f"traces={condition.name} repetitions={condition.repetitions}") + return watchdog, emergency + + +def simulate_motion( + trace: TransportTrace, + policy: ThresholdPolicy, + initial_speed_mps: float, + profile: DecelerationProfile, + *, + emergency_receive_seconds: float | None = None, + emergency_formation_seconds: float | None = None, +) -> MotionTrial: + fsm = TwoStageFailsafe( + policy, + profile, + resume_acceleration_mps2=RESUME_ACCELERATION_MPS2, + ) + receives = tuple((time, sequence) for time, sequence in trace.command_receives if time <= DURATION_SECONDS + EPSILON) + receive_index = 0 + current = 0.0 + speed = initial_speed_mps + distance = 0.0 + target_speed = initial_speed_mps + last_fresh_distance = 0.0 + last_fresh_speed = initial_speed_mps + active: ActiveEvent | None = None + protection_events: list[ProtectionEvent] = [] + state_time = {state: 0.0 for state in SafetyState} + zero_speed_time = 0.0 + stage1_transitions = stage2_transitions = full_stops = 0 + negative_speed_cases = target_exceeded_cases = 0 + resume_start: float | None = None + resume_durations: list[float] = [] + short_reductions: list[float] = [] + short_outage_full_stops = 0 + stale_release_cases = ordinary_emergency_release_cases = 0 + emergency_formation_done = emergency_receive_done = False + emergency_formation_distance = emergency_formation_speed = 0.0 + emergency_receive_distance = emergency_receive_speed = 0.0 + first_zero_after_formation_time: float | None = None + first_zero_after_formation_distance: float | None = None + + def finalize_active(end_time: float, recovered: bool) -> None: + nonlocal active, short_outage_full_stops + if active is None: + return + reached_stage2 = active.second_time is not None + second_speed = active.second_speed if active.second_speed is not None else speed + second_distance = active.second_distance if active.second_distance is not None else distance + full_stop = active.stop_time is not None and active.stop_distance is not None + braking_distance = ( + max(0.0, active.stop_distance - second_distance) + if full_stop and active.stop_distance is not None + else 0.0 + ) + total_stop_distance = ( + max(0.0, active.stop_distance - active.last_fresh_distance) + if full_stop and active.stop_distance is not None + else 0.0 + ) + time_to_stop = ( + active.stop_time - active.last_fresh_time + if full_stop and active.stop_time is not None + else 0.0 + ) + gap = max(0.0, end_time - active.last_fresh_time) + protection_events.append( + ProtectionEvent( + gap, + active.last_fresh_speed, + active.first_speed, + second_speed, + max(0.0, active.first_distance - active.last_fresh_distance), + max(0.0, second_distance - active.first_distance), + braking_distance, + total_stop_distance, + time_to_stop, + active.min_speed, + full_stop, + recovered and not full_stop, + reached_stage2, + ) + ) + if recovered and not reached_stage2: + short_reductions.append(max(0.0, active.last_fresh_speed - active.min_speed)) + if full_stop and gap < 0.5 - EPSILON: + short_outage_full_stops += 1 + active = None + + while current < DURATION_SECONDS - EPSILON: + candidates: list[tuple[float, int, str]] = [ + (DURATION_SECONDS, EVENT_PRIORITY["end"], "end") + ] + if receive_index < len(receives): + candidates.append( + (receives[receive_index][0], EVENT_PRIORITY["receive"], "receive") + ) + if emergency_formation_seconds is not None and not emergency_formation_done: + candidates.append( + ( + emergency_formation_seconds, + EVENT_PRIORITY["emergency_formation"], + "emergency_formation", + ) + ) + if emergency_receive_seconds is not None and not emergency_receive_done: + candidates.append( + ( + emergency_receive_seconds, + EVENT_PRIORITY["emergency_receive"], + "emergency_receive", + ) + ) + if fsm.state is SafetyState.NORMAL: + if policy.stage1_seconds is not None: + first_time = fsm.last_fresh_time_seconds + policy.stage1_seconds + if first_time > current + EPSILON: + candidates.append((first_time, EVENT_PRIORITY["stage1"], "stage1")) + second_time = fsm.last_fresh_time_seconds + policy.stage2_seconds + if second_time > current + EPSILON: + candidates.append((second_time, EVENT_PRIORITY["stage2"], "stage2")) + elif fsm.state is SafetyState.STAGE1_DECELERATION: + second_time = fsm.last_fresh_time_seconds + policy.stage2_seconds + if second_time > current + EPSILON: + candidates.append((second_time, EVENT_PRIORITY["stage2"], "stage2")) + next_time, _, event_type = min(candidates, key=lambda item: (item[0], item[1])) + if next_time < current - EPSILON: + raise AssertionError("motion event time moved backwards") + duration = max(0.0, next_time - current) + state_before = fsm.state + acceleration = fsm.acceleration_mps2(speed, target_speed) + step = integrate_kinematics( + speed, + acceleration, + duration, + target_speed_mps=target_speed if acceleration > 0.0 else None, + ) + state_time[state_before] += duration + if speed <= EPSILON: + zero_speed_time += duration + elif step.zero_after_seconds is not None: + zero_speed_time += max(0.0, duration - step.zero_after_seconds) + if active is not None: + active.min_speed = min(active.min_speed, step.final_speed_mps) + if step.zero_after_seconds is not None and active.stop_time is None: + active.stop_time = current + step.zero_after_seconds + active.stop_distance = distance + step.distance_m + full_stops += 1 + if emergency_formation_done and first_zero_after_formation_time is None: + if speed <= EPSILON: + first_zero_after_formation_time = current + first_zero_after_formation_distance = distance + elif step.zero_after_seconds is not None: + first_zero_after_formation_time = current + step.zero_after_seconds + first_zero_after_formation_distance = distance + step.distance_m + if resume_start is not None and step.target_after_seconds is not None: + resume_durations.append(current + step.target_after_seconds - resume_start) + resume_start = None + distance += step.distance_m + speed = step.final_speed_mps + current = next_time + negative_speed_cases += int(speed < -EPSILON) + target_exceeded_cases += int(speed > target_speed + 1e-9) + + if event_type == "end": + break + if event_type == "emergency_formation": + emergency_formation_done = True + emergency_formation_distance = distance + emergency_formation_speed = speed + continue + if event_type == "emergency_receive": + emergency_receive_done = True + finalize_active(current, False) + fsm.receive_emergency(STREAM_EMERGENCY, 1) + emergency_receive_distance = distance + emergency_receive_speed = speed + resume_start = None + continue + if event_type == "receive": + receive_time, sequence = receives[receive_index] + receive_index += 1 + if fsm.state is not SafetyState.EMERGENCY_LATCHED: + finalize_active(receive_time, True) + was_safe = fsm.state is not SafetyState.NORMAL + state_before_receive = fsm.state + accepted = fsm.receive_command(sequence, receive_time) + if not accepted and state_before_receive is not SafetyState.NORMAL and fsm.state is not state_before_receive: + stale_release_cases += 1 + if state_before_receive is SafetyState.EMERGENCY_LATCHED and fsm.state is not SafetyState.EMERGENCY_LATCHED: + ordinary_emergency_release_cases += 1 + if accepted: + last_fresh_distance = distance + last_fresh_speed = speed + if was_safe and fsm.state is SafetyState.NORMAL and speed < target_speed - EPSILON: + resume_start = current + continue + if event_type == "stage1": + fsm.apply_watchdog(current) + if fsm.state is not SafetyState.STAGE1_DECELERATION: + raise AssertionError("first threshold did not enter stage1") + stage1_transitions += 1 + resume_start = None + active = ActiveEvent( + fsm.last_fresh_time_seconds, + last_fresh_speed, + last_fresh_distance, + current, + speed, + distance, + min_speed=speed, + ) + continue + if event_type == "stage2": + fsm.apply_watchdog(current) + if fsm.state is not SafetyState.STAGE2_BRAKING: + raise AssertionError("second threshold did not enter braking") + stage2_transitions += 1 + resume_start = None + if active is None: + active = ActiveEvent( + fsm.last_fresh_time_seconds, + last_fresh_speed, + last_fresh_distance, + current, + speed, + distance, + min_speed=speed, + ) + active.second_time = current + active.second_speed = speed + active.second_distance = distance + + finalize_active(DURATION_SECONDS, False) + times = [0.0, *[time for time, _ in receives], DURATION_SECONDS] + gaps = [max(0.0, right - left) for left, right in zip(times, times[1:])] + first_threshold = policy.stage1_seconds if policy.stage1_seconds is not None else policy.stage2_seconds + communication_gaps = sum(gap > 0.050001 for gap in gaps) + # A fresh command received exactly on a threshold wins the event tie and + # prevents a watchdog transition. Therefore communication gaps are + # classified with strict threshold exceedance, matching the task wording. + gaps_over_first = sum(gap > first_threshold + EPSILON for gap in gaps) + gaps_over_second = sum(gap > policy.stage2_seconds + EPSILON for gap in gaps) + recovered_before_first = sum(0.050001 < gap <= first_threshold + EPSILON for gap in gaps[:-1]) + recovered_between = sum( + first_threshold + EPSILON < gap <= policy.stage2_seconds + EPSILON for gap in gaps[:-1] + ) + recovered_after = sum(gap > policy.stage2_seconds + EPSILON for gap in gaps[:-1]) + emergency_motion = None + if emergency_formation_seconds is not None: + zero_time = first_zero_after_formation_time + zero_distance = first_zero_after_formation_distance + delivered = emergency_receive_seconds is not None + path_delivery = ( + max(0.0, emergency_receive_distance - emergency_formation_distance) + if delivered + else 0.0 + ) + braking_distance = ( + max(0.0, zero_distance - emergency_receive_distance) + if delivered and zero_distance is not None + else 0.0 + ) + total_path = ( + max(0.0, zero_distance - emergency_formation_distance) + if zero_distance is not None + else 0.0 + ) + emergency_motion = EmergencyMotion( + path_delivery, + emergency_receive_speed if delivered else emergency_formation_speed, + braking_distance, + total_path, + zero_time - emergency_formation_seconds if zero_time is not None else 0.0, + not delivered and zero_time is not None, + ) + return MotionTrial( + communication_gaps, + gaps_over_first, + gaps_over_second, + stage1_transitions, + stage2_transitions, + recovered_before_first, + recovered_between, + recovered_after, + max(gaps, default=0.0) * 1000.0, + tuple(protection_events), + state_time[SafetyState.STAGE1_DECELERATION] / DURATION_SECONDS, + state_time[SafetyState.STAGE2_BRAKING] / DURATION_SECONDS, + zero_speed_time / DURATION_SECONDS, + stage1_transitions / (DURATION_SECONDS / 60.0), + stage2_transitions / (DURATION_SECONDS / 60.0), + full_stops / (DURATION_SECONDS / 60.0), + _mean(short_reductions), + _mean(resume_durations), + short_outage_full_stops, + negative_speed_cases, + target_exceeded_cases, + max(0, gaps_over_second - stage2_transitions), + stale_release_cases, + ordinary_emergency_release_cases, + emergency_motion, + ) + + +def aggregate_motion_combination( + condition: ChannelCondition, + policy: ThresholdPolicy, + speed_kmh: float, + profile: DecelerationProfile, + trials: tuple[MotionTrial, ...], +) -> tuple[SummaryMetrics, WatchdogMetrics, DistanceMetrics]: + events = tuple(event for trial in trials for event in trial.events) + stopped = tuple(event for event in events if event.full_stop) + total_paths = tuple(event.total_distance_to_stop_m for event in stopped) + first_paths = tuple(event.distance_to_first_threshold_m for event in events) + between_paths = tuple(event.distance_between_thresholds_m for event in events) + second_paths = tuple( + event.distance_to_first_threshold_m + event.distance_between_thresholds_m for event in events + ) + braking_paths = tuple(event.braking_distance_m for event in stopped) + stop_times = tuple(event.time_to_stop_seconds for event in stopped) + speeds_last = tuple(event.speed_last_fresh_mps for event in events) + speeds_first = tuple(event.speed_first_threshold_mps for event in events) + speeds_second = tuple(event.speed_second_threshold_mps for event in events) + minimum_speeds = tuple(event.minimum_speed_mps for event in events) + summary = SummaryMetrics( + condition.name, + policy.name, + speed_kmh, + profile.name, + len(trials), + _mean(trial.preliminary_reactions_per_minute for trial in trials), + _mean(trial.mandatory_brakings_per_minute for trial in trials), + _mean(trial.full_stops_per_minute for trial in trials), + _mean(total_paths), + percentile(total_paths, 95), + max(total_paths, default=0.0), + max(trial.max_command_gap_ms for trial in trials), + _mean(trial.stage1_time_fraction for trial in trials), + _mean(trial.stage2_time_fraction for trial in trials), + _mean(trial.zero_speed_fraction for trial in trials), + sum(trial.negative_speed_cases for trial in trials), + sum(trial.target_speed_exceeded_cases for trial in trials), + sum(trial.missed_stage2_cases for trial in trials), + sum(trial.stale_release_cases for trial in trials), + sum(trial.ordinary_emergency_release_cases for trial in trials), + ) + watchdog = WatchdogMetrics( + condition.name, + policy.name, + speed_kmh, + profile.name, + len(trials), + _mean(trial.communication_gaps for trial in trials), + _mean(trial.gaps_over_first for trial in trials), + _mean(trial.gaps_over_second for trial in trials), + _mean(trial.stage1_transitions for trial in trials), + _mean(trial.stage2_transitions for trial in trials), + _mean(trial.recovered_before_first for trial in trials), + _mean(trial.recovered_between_thresholds for trial in trials), + _mean(trial.recovered_after_second for trial in trials), + max(trial.max_command_gap_ms for trial in trials), + summary.preliminary_reactions_per_minute, + summary.mandatory_brakings_per_minute, + summary.full_stops_per_minute, + summary.stage1_time_fraction, + summary.stage2_time_fraction, + summary.zero_speed_fraction, + _mean(trial.mean_short_speed_reduction_mps for trial in trials), + _mean(trial.mean_resume_time_seconds for trial in trials), + _mean(trial.short_outage_full_stops for trial in trials), + ) + distance = DistanceMetrics( + channel_condition=condition.name, + policy=policy.name, + initial_speed_kmh=speed_kmh, + deceleration_profile=profile.name, + event_count=len(events), + mean_speed_last_fresh_mps=_mean(speeds_last), + p95_speed_last_fresh_mps=percentile(speeds_last, 95), + max_speed_last_fresh_mps=max(speeds_last, default=0.0), + mean_speed_first_threshold_mps=_mean(speeds_first), + p95_speed_first_threshold_mps=percentile(speeds_first, 95), + max_speed_first_threshold_mps=max(speeds_first, default=0.0), + mean_speed_second_threshold_mps=_mean(speeds_second), + p95_speed_second_threshold_mps=percentile(speeds_second, 95), + max_speed_second_threshold_mps=max(speeds_second, default=0.0), + mean_distance_to_first_m=_mean(first_paths), + p95_distance_to_first_m=percentile(first_paths, 95), + max_distance_to_first_m=max(first_paths, default=0.0), + mean_distance_between_m=_mean(between_paths), + p95_distance_between_m=percentile(between_paths, 95), + max_distance_between_m=max(between_paths, default=0.0), + mean_distance_to_second_m=_mean(second_paths), + p95_distance_to_second_m=percentile(second_paths, 95), + max_distance_to_second_m=max(second_paths, default=0.0), + mean_braking_distance_m=_mean(braking_paths), + p95_braking_distance_m=percentile(braking_paths, 95), + max_braking_distance_m=max(braking_paths, default=0.0), + mean_total_stop_path_m=_mean(total_paths), + p95_total_stop_path_m=percentile(total_paths, 95), + max_total_stop_path_m=max(total_paths, default=0.0), + mean_time_to_stop_seconds=_mean(stop_times), + p95_time_to_stop_seconds=percentile(stop_times, 95), + max_time_to_stop_seconds=max(stop_times, default=0.0), + mean_minimum_speed_mps=_mean(minimum_speeds), + p95_minimum_speed_mps=percentile(minimum_speeds, 95), + max_minimum_speed_mps=max(minimum_speeds, default=0.0), + full_stop_fraction=len(stopped) / len(events) if events else 0.0, + recovery_before_stop_fraction=( + sum(event.recovered_before_stop for event in events) / len(events) if events else 0.0 + ), + ) + return summary, watchdog, distance + + +def aggregate_emergency_combination( + condition: ChannelCondition, + speed_kmh: float, + profile: DecelerationProfile, + traces: tuple[TransportTrace, ...], +) -> EmergencyStopMetrics: + motion_trials = [] + for trace in traces: + assert trace.emergency is not None + motion_trials.append( + simulate_motion( + trace, + POLICIES[2], + speed_kmh_to_mps(speed_kmh), + profile, + emergency_receive_seconds=trace.emergency.first_receive_seconds, + emergency_formation_seconds=EMERGENCY_TIME_SECONDS, + ) + ) + motions = tuple(trial.emergency_motion for trial in motion_trials) + assert all(motion is not None for motion in motions) + typed_motions = tuple(motion for motion in motions if motion is not None) + delivered_indices = tuple(index for index, trace in enumerate(traces) if trace.emergency and trace.emergency.delivered) + delivery_delays = tuple( + (traces[index].emergency.first_receive_seconds - EMERGENCY_TIME_SECONDS) * 1000.0 + for index in delivered_indices + if traces[index].emergency and traces[index].emergency.first_receive_seconds is not None + ) + delivered_motions = tuple(typed_motions[index] for index in delivered_indices) + ack_delays = tuple( + (trace.emergency.first_ack_seconds - EMERGENCY_TIME_SECONDS) * 1000.0 + for trace in traces + if trace.emergency and trace.emergency.first_ack_seconds is not None + ) + undelivered = tuple(index for index in range(len(traces)) if index not in delivered_indices) + total_paths = tuple(motion.total_path_m for motion in delivered_motions) + return EmergencyStopMetrics( + condition.name, + speed_kmh, + profile.name, + len(traces), + len(delivered_indices) / len(traces), + _mean(delivery_delays), + percentile(delivery_delays, 95), + max(delivery_delays, default=0.0), + _mean(motion.path_during_delivery_m for motion in delivered_motions), + _mean(motion.speed_at_receive_mps for motion in delivered_motions), + _mean(motion.braking_distance_m for motion in delivered_motions), + _mean(total_paths), + percentile(total_paths, 95), + max(total_paths, default=0.0), + _mean(motion.time_to_stop_seconds for motion in delivered_motions), + _mean(trace.emergency.copies_transmitted for trace in traces if trace.emergency), + _mean(trace.emergency.copies_lost for trace in traces if trace.emergency), + _mean(ack_delays), + _mean(trace.emergency.acknowledgements_lost for trace in traces if trace.emergency), + len(undelivered), + ( + sum(motion_trials[index].stage2_transitions > 0 for index in undelivered) / len(undelivered) + if undelivered + else 0.0 + ), + ( + sum(typed_motions[index].local_watchdog_stop for index in undelivered) / len(undelivered) + if undelivered + else 0.0 + ), + _mean(typed_motions[index].total_path_m for index in undelivered if typed_motions[index].local_watchdog_stop), + _mean( + typed_motions[index].time_to_stop_seconds + for index in undelivered + if typed_motions[index].local_watchdog_stop + ), + ) + + +def analytic_checks() -> tuple[AnalyticCheck, ...]: + rows = [] + single_policy = POLICIES[0] + two_policy = POLICIES[2] + for speed_kmh in SPEEDS_KMH: + speed = speed_kmh_to_mps(speed_kmh) + for profile in PROFILES: + single_model = forced_stop(speed, single_policy, profile) + single_reaction = speed * single_policy.stage2_seconds + single_braking = speed * speed / (2.0 * profile.stage2_mps2) + single_total = single_reaction + single_braking + two_model = forced_stop(speed, two_policy, profile) + assert two_policy.stage1_seconds is not None + stage1_duration = two_policy.stage2_seconds - two_policy.stage1_seconds + time_to_stage1_stop = speed / profile.stage1_mps2 + moving_stage1 = min(stage1_duration, time_to_stage1_stop) + two_reaction = speed * two_policy.stage1_seconds + two_deceleration = speed * moving_stage1 - 0.5 * profile.stage1_mps2 * moving_stage1 * moving_stage1 + speed_at_second = max(0.0, speed - profile.stage1_mps2 * stage1_duration) + two_braking = speed_at_second * speed_at_second / (2.0 * profile.stage2_mps2) + two_total = two_reaction + two_deceleration + two_braking + error = max(abs(single_total - single_model.total_distance_m), abs(two_total - two_model.total_distance_m)) + rows.append( + AnalyticCheck( + speed_kmh, + profile.name, + single_reaction, + single_braking, + single_total, + single_model.total_distance_m, + two_reaction, + two_deceleration, + two_braking, + two_total, + two_model.total_distance_m, + two_total - single_total, + error, + ) + ) + return tuple(rows) + + +def run_experiment( + workload: Workload, +) -> tuple[ + tuple[SummaryMetrics, ...], + tuple[WatchdogMetrics, ...], + tuple[DistanceMetrics, ...], + tuple[EmergencyStopMetrics, ...], + tuple[AnalyticCheck, ...], + dict[str, tuple[TransportTrace, ...]], + dict[str, tuple[TransportTrace, ...]], +]: + watchdog_traces, emergency_traces = build_trace_sets(workload) + summaries: list[SummaryMetrics] = [] + watchdog_rows: list[WatchdogMetrics] = [] + distance_rows: list[DistanceMetrics] = [] + for condition in CHANNEL_CONDITIONS: + traces = watchdog_traces[condition.name] + for policy in POLICIES: + for speed_kmh in SPEEDS_KMH: + speed = speed_kmh_to_mps(speed_kmh) + for profile in PROFILES: + trials = tuple(simulate_motion(trace, policy, speed, profile) for trace in traces) + aggregate = aggregate_motion_combination(condition, policy, speed_kmh, profile, trials) + summaries.append(aggregate[0]) + watchdog_rows.append(aggregate[1]) + distance_rows.append(aggregate[2]) + print(f"motion={condition.name} combinations=36") + emergency_rows = [] + for condition in CHANNEL_CONDITIONS: + for speed_kmh in SPEEDS_KMH: + for profile in PROFILES: + emergency_rows.append( + aggregate_emergency_combination( + condition, + speed_kmh, + profile, + emergency_traces[condition.name], + ) + ) + print(f"emergency={condition.name} combinations=9") + return ( + tuple(summaries), + tuple(watchdog_rows), + tuple(distance_rows), + tuple(emergency_rows), + analytic_checks(), + watchdog_traces, + emergency_traces, + ) + + +def run_functional_tests( + workload: Workload, + watchdog_traces: dict[str, tuple[TransportTrace, ...]], + emergency_traces: dict[str, tuple[TransportTrace, ...]], +) -> tuple[FunctionalTestResult, ...]: + results: list[FunctionalTestResult] = [] + policy = POLICIES[2] + profile = PROFILES[1] + + def check(name: str, function) -> None: + try: + detail = function() or "ok" + results.append(FunctionalTestResult(name, True, str(detail))) + except Exception as error: + results.append(FunctionalTestResult(name, False, f"{type(error).__name__}: {error}")) + + def fresh_updates() -> str: + fsm = TwoStageFailsafe(policy, profile) + assert fsm.receive_command(1, 0.05) + assert fsm.last_fresh_time_seconds == 0.05 + return "fresh sequence updates timer" + + def old_does_not_update() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.receive_command(2, 0.05) + assert not fsm.receive_command(1, 0.10) + assert fsm.last_fresh_time_seconds == 0.05 + return "old sequence ignored" + + def duplicate_does_not_update() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.receive_command(2, 0.05) + assert not fsm.receive_command(2, 0.10) + assert fsm.last_fresh_time_seconds == 0.05 + return "equal sequence ignored" + + def first_enters_stage1() -> str: + fsm = TwoStageFailsafe(policy, profile) + assert fsm.apply_watchdog(0.15) is SafetyState.STAGE1_DECELERATION + return "150 ms enters preliminary deceleration" + + def second_enters_stage2() -> str: + fsm = TwoStageFailsafe(policy, profile) + assert fsm.apply_watchdog(0.25) is SafetyState.STAGE2_BRAKING + return "250 ms enters mandatory braking" + + def single_skips_stage1() -> str: + fsm = TwoStageFailsafe(POLICIES[0], profile) + assert fsm.apply_watchdog(0.249) is SafetyState.NORMAL + assert fsm.apply_watchdog(0.250) is SafetyState.STAGE2_BRAKING + return "single threshold goes directly to stage2" + + def stage1_forbids_acceleration() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.apply_watchdog(0.15) + assert fsm.acceleration_mps2(3.0, 5.0) <= 0.0 + return "stage1 acceleration is non-positive" + + def stage2_targets_stop() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.apply_watchdog(0.25) + assert fsm.state is SafetyState.STAGE2_BRAKING + assert fsm.acceleration_mps2(3.0, 5.0) == -profile.stage2_mps2 + return "stage2 applies mandatory braking to zero" + + def speed_never_negative() -> str: + step = integrate_kinematics(1.0, -4.0, 5.0) + assert step.final_speed_mps == 0.0 + return "braking is clipped at zero" + + def constant_acceleration_formula() -> str: + step = integrate_kinematics(2.0, 1.0, 3.0) + assert abs(step.final_speed_mps - 5.0) < 1e-12 + assert abs(step.distance_m - 10.5) < 1e-12 + return "v and s match analytic formula" + + def zero_inside_interval() -> str: + step = integrate_kinematics(2.0, -4.0, 3.0) + assert abs(step.distance_m - 0.5) < 1e-12 + assert abs(step.zero_after_seconds - 0.5) < 1e-12 + return "internal stop time integrated exactly" + + def new_releases_temporary() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.apply_watchdog(0.15) + assert fsm.receive_command(1, 0.16) + assert fsm.state is SafetyState.NORMAL + return "fresh command releases temporary state" + + def old_does_not_release() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.receive_command(2, 0.01) + fsm.apply_watchdog(0.16) + assert not fsm.receive_command(1, 0.17) + assert fsm.state is SafetyState.STAGE1_DECELERATION + return "old command cannot release stage1" + + def emergency_latches() -> str: + fsm = TwoStageFailsafe(policy, profile) + assert fsm.receive_emergency(STREAM_EMERGENCY, 1) + assert fsm.state is SafetyState.EMERGENCY_LATCHED + return "first emergency latches state" + + def normal_does_not_release_emergency() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.receive_emergency(STREAM_EMERGENCY, 1) + fsm.receive_command(1, 0.1) + assert fsm.state is SafetyState.EMERGENCY_LATCHED + return "ordinary command cannot unlatch emergency" + + def ack_not_required_to_brake() -> str: + fsm = TwoStageFailsafe(policy, profile) + fsm.receive_emergency(STREAM_EMERGENCY, 1) + assert fsm.acceleration_mps2(2.0, 4.0) == -profile.stage2_mps2 + return "braking starts before any ACK" + + def lost_ack_continues() -> str: + bad_starts = np.asarray([60.0018]) + bad_ends = np.asarray([60.0100]) + + def controlled_trace() -> TransportTrace: + return build_transport_trace( + workload, + 300.0, + bad_starts, + bad_ends, + include_emergency=True, + ) + + controlled = controlled_trace() + assert controlled.emergency is not None + assert controlled.emergency.acknowledgements_lost == 1 + assert controlled.emergency.copies_transmitted == 2 + assert controlled.emergency.first_ack_seconds is not None + assert controlled == controlled_trace() + return "controlled first ACK loss deterministically causes exactly one later copy" + + def received_ack_stops() -> str: + events = [trace.emergency for traces in emergency_traces.values() for trace in traces if trace.emergency] + assert any(event.first_ack_seconds is not None and event.copies_transmitted < len(EMERGENCY_SPREAD_US) for event in events) + return "received ACK stops future copies" + + def stage2_not_missed() -> str: + trial = simulate_motion(TransportTrace((), None, 0), policy, speed_kmh_to_mps(25.0), profile) + assert trial.missed_stage2_cases == 0 and trial.stage2_transitions == 1 + return "second threshold always enters braking" + + def reproducible() -> str: + left = bad_intervals(122.0, 200.0, LAB039_SEED_OFFSET + MASTER_SEED) + right = bad_intervals(122.0, 200.0, LAB039_SEED_OFFSET + MASTER_SEED) + assert np.array_equal(left[0], right[0]) and np.array_equal(left[1], right[1]) + return "identical seed gives identical intervals" + + def fresh_at_first_threshold_wins() -> str: + assert policy.stage1_seconds is not None + assert EVENT_PRIORITY["receive"] < EVENT_PRIORITY["stage1"] + trial = simulate_motion( + TransportTrace(((policy.stage1_seconds, 1),), None, 0), + policy, + speed_kmh_to_mps(25.0), + profile, + ) + assert trial.stage1_transitions == 1 + assert trial.stage2_transitions == 1 + assert len(trial.events) == 1 + assert abs( + trial.events[0].distance_to_first_threshold_m + - speed_kmh_to_mps(25.0) * policy.stage1_seconds + ) < 1e-12 + return "fresh command at stage1 time is received before the threshold" + + def fresh_at_second_threshold_wins() -> str: + assert EVENT_PRIORITY["receive"] < EVENT_PRIORITY["stage2"] + trial = simulate_motion( + TransportTrace(((policy.stage2_seconds, 1),), None, 0), + policy, + speed_kmh_to_mps(25.0), + profile, + ) + assert trial.stage1_transitions == 2 + assert trial.stage2_transitions == 1 + assert len(trial.events) == 2 + first_event = trial.events[0] + assert abs(first_event.gap_seconds - policy.stage2_seconds) < 1e-12 + assert first_event.recovered_before_stop + assert not first_event.reached_stage2 + return "fresh command at stage2 time is received before mandatory braking" + + checks = ( + ("01_fresh_command_updates_watchdog", fresh_updates), + ("02_old_command_does_not_update_watchdog", old_does_not_update), + ("03_duplicate_does_not_update_watchdog", duplicate_does_not_update), + ("04_first_threshold_enters_stage1", first_enters_stage1), + ("05_second_threshold_enters_stage2", second_enters_stage2), + ("06_single_threshold_skips_stage1", single_skips_stage1), + ("07_stage1_forbids_positive_acceleration", stage1_forbids_acceleration), + ("08_stage2_commands_zero_speed", stage2_targets_stop), + ("09_speed_never_negative", speed_never_negative), + ("10_constant_acceleration_matches_formula", constant_acceleration_formula), + ("11_internal_zero_crossing_is_exact", zero_inside_interval), + ("12_new_command_releases_temporary_state", new_releases_temporary), + ("13_old_command_does_not_release_state", old_does_not_release), + ("14_emergency_enters_latched_state", emergency_latches), + ("15_normal_command_does_not_unlatch", normal_does_not_release_emergency), + ("16_ack_not_required_for_braking", ack_not_required_to_brake), + ("17_lost_ack_continues_repetition", lost_ack_continues), + ("18_received_ack_stops_future_copies", received_ack_stops), + ("19_stage2_threshold_never_missed", stage2_not_missed), + ("20_fixed_seed_reproducibility", reproducible), + ("21_fresh_command_wins_first_threshold_tie", fresh_at_first_threshold_wins), + ("22_fresh_command_wins_second_threshold_tie", fresh_at_second_threshold_wins), + ) + for name, function in checks: + check(name, function) + return tuple(results) + + +def _write_csv(path: Path, row_type: type, rows: Iterable[object]) -> None: + with path.open("w", newline="", encoding="utf-8") as file: + writer = csv.DictWriter(file, fieldnames=tuple(row_type.__dataclass_fields__)) + writer.writeheader() + writer.writerows(asdict(row) for row in rows) + + +def save_plots( + summaries: tuple[SummaryMetrics, ...], + watchdog: tuple[WatchdogMetrics, ...], + distances: tuple[DistanceMetrics, ...], + emergencies: tuple[EmergencyStopMetrics, ...], + analytics: tuple[AnalyticCheck, ...], +) -> None: + policy_colors = { + "single_250": "#777777", + "two_100_200": "#d95f02", + "two_150_250": "#1b9e77", + "two_200_300": "#2878b5", + } + profile_colors = {"soft": "#e67e22", "nominal": "#2878b5", "intensive": "#2a9d55"} + + figure, axis = plt.subplots(figsize=(8, 5)) + for profile in PROFILES: + rows = [row for row in analytics if row.deceleration_profile == profile.name] + axis.plot( + [row.initial_speed_kmh for row in rows], + [row.two_stage_total_model_m for row in rows], + marker="o", + color=profile_colors[profile.name], + label=PROFILE_LABELS[profile.name], + ) + axis.set_xlabel("Начальная скорость, км/ч") + axis.set_ylabel("Полный путь до остановки, м") + axis.set_title("Полный путь при политике 150/250 мс") + axis.grid(True, alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(PATH_SPEED_PLOT, dpi=150) + plt.close(figure) + + figure, axis = plt.subplots(figsize=(9, 5)) + selected = [ + row for row in summaries + if row.channel_condition == "230_1000" + and row.initial_speed_kmh == 25.0 + and row.deceleration_profile == "nominal" + ] + axis.bar( + [POLICY_LABELS[row.policy] for row in selected], + [row.max_total_stop_path_m for row in selected], + color=[policy_colors[row.policy] for row in selected], + ) + axis.set_ylabel("Максимальный путь до остановки, м") + axis.set_title("Сравнение политик: 230 кбит/с, помеха 1000 мс") + axis.tick_params(axis="x", rotation=15) + axis.grid(True, axis="y", alpha=0.3) + figure.tight_layout() + figure.savefig(POLICY_PLOT, dpi=150) + plt.close(figure) + + figure, axis = plt.subplots(figsize=(8, 5)) + rows = [row for row in analytics if row.initial_speed_kmh == 25.0] + x = np.arange(len(PROFILES)) + axis.bar( + x - 0.18, + [next(row.single_total_model_m for row in rows if row.deceleration_profile == profile.name) for profile in PROFILES], + width=0.36, + label="Один порог 250 мс", + ) + axis.bar( + x + 0.18, + [next(row.two_stage_total_model_m for row in rows if row.deceleration_profile == profile.name) for profile in PROFILES], + width=0.36, + label="Два порога 150/250 мс", + ) + axis.set_xticks(x, [PROFILE_LABELS[profile.name] for profile in PROFILES]) + axis.set_ylabel("Полный путь, м") + axis.set_title("Влияние доступного замедления при 25 км/ч") + axis.grid(True, axis="y", alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(PROFILE_PLOT, dpi=150) + plt.close(figure) + + figure, axis = plt.subplots(figsize=(9, 5)) + selected = [ + row for row in watchdog + if row.channel_condition == "260_200" + and row.initial_speed_kmh == 25.0 + and row.deceleration_profile == "nominal" + ] + x = np.arange(len(selected)) + axis.bar(x - 0.18, [row.preliminary_reactions_per_minute for row in selected], width=0.36, label="Предварительные реакции") + axis.bar(x + 0.18, [row.mandatory_brakings_per_minute for row in selected], width=0.36, label="Обязательные торможения") + axis.set_xticks(x, [POLICY_LABELS[row.policy] for row in selected], rotation=15) + axis.set_ylabel("Событий в минуту") + axis.set_title("Частота защитных реакций") + axis.grid(True, axis="y", alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(REACTION_PLOT, dpi=150) + plt.close(figure) + + figure, axis = plt.subplots(figsize=(9, 5)) + x = np.arange(len(selected)) + axis.bar(x, [row.stage1_time_fraction * 100.0 for row in selected], label="Предварительное замедление") + axis.bar( + x, + [row.stage2_time_fraction * 100.0 for row in selected], + bottom=[row.stage1_time_fraction * 100.0 for row in selected], + label="Обязательное торможение", + ) + axis.set_xticks(x, [POLICY_LABELS[row.policy] for row in selected], rotation=15) + axis.set_ylabel("Доля времени, %") + axis.set_title("Время в защитных состояниях") + axis.grid(True, axis="y", alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(STATE_TIME_PLOT, dpi=150) + plt.close(figure) + + figure, axis = plt.subplots(figsize=(8, 5)) + for profile in PROFILES: + rows = [ + row for row in emergencies + if row.channel_condition == "230_1000" and row.deceleration_profile == profile.name + ] + axis.plot( + [row.initial_speed_kmh for row in rows], + [row.mean_total_path_m for row in rows], + marker="o", + color=profile_colors[profile.name], + label=PROFILE_LABELS[profile.name], + ) + axis.set_xlabel("Начальная скорость, км/ч") + axis.set_ylabel("Средний путь от команды до остановки, м") + axis.set_title("Удалённая аварийная остановка: 230 кбит/с, 1000 мс") + axis.grid(True, alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(EMERGENCY_PATH_PLOT, dpi=150) + plt.close(figure) + + figure, axis = plt.subplots(figsize=(7, 6)) + analytic_values = [row.two_stage_total_analytic_m for row in analytics] + model_values = [row.two_stage_total_model_m for row in analytics] + axis.scatter(analytic_values, model_values, color="#2878b5") + limit = max(analytic_values + model_values + [1.0]) + axis.plot([0.0, limit], [0.0, limit], linestyle="--", color="black", label="Точное совпадение") + axis.set_xlabel("Аналитический путь, м") + axis.set_ylabel("Событийная модель, м") + axis.set_title("Проверка аналитической дистанции") + axis.grid(True, alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(ANALYTIC_PLOT, dpi=150) + plt.close(figure) + + figure, axis = plt.subplots(figsize=(8, 5)) + for policy in POLICIES: + rows = [row for row in summaries if row.policy == policy.name and row.initial_speed_kmh == 25.0] + axis.scatter( + _mean(row.preliminary_reactions_per_minute + row.mandatory_brakings_per_minute for row in rows), + max(row.max_total_stop_path_m for row in rows), + s=90, + color=policy_colors[policy.name], + label=POLICY_LABELS[policy.name], + ) + axis.set_xlabel("Средняя частота защитных переходов, 1/мин") + axis.set_ylabel("Максимальный полный путь, м") + axis.set_title("Компромисс: частота реакций и путь до остановки") + axis.grid(True, alpha=0.3) + axis.legend(fontsize=8) + figure.tight_layout() + figure.savefig(TRADEOFF_PLOT, dpi=150) + plt.close(figure) + + +def write_report( + workload: Workload, + summaries: tuple[SummaryMetrics, ...], + watchdog: tuple[WatchdogMetrics, ...], + distances: tuple[DistanceMetrics, ...], + emergencies: tuple[EmergencyStopMetrics, ...], + analytics: tuple[AnalyticCheck, ...], + tests: tuple[FunctionalTestResult, ...], +) -> None: + representative_emergencies = tuple( + row + for row in emergencies + if row.initial_speed_kmh == SPEEDS_KMH[0] and row.deceleration_profile == PROFILES[0].name + ) + lines = [ + "Lab039 — двухступенчатая безопасная реакция и оценка пути до остановки", + "", + "Состояние Git до реализации", + "- Корень: C:/Users/user/Desktop/projects/SDR_Rover", + "- Ветка: main", + "- HEAD: 23cfdf581b63d2674e7c48965aea45cc5afff2d7", + "- Перед окончательным повторным запуском рабочее дерево содержало только новые файлы Lab039; индекс был пуст.", + "- Неизвестных изменений не было; локально известный origin/main имел ahead/behind 0/0.", + "- Lab036–Lab038 присутствовали; Lab038 зафиксирована коммитом 23cfdf5.", + "- Fetch, pull и push не выполнялись.", + "", + "Конечный автомат", + "- NORMAL поддерживает заданную скорость и принимает только команды с новым sequence.", + "- STAGE1_DECELERATION запрещает положительное ускорение и применяет a_stage1.", + "- STAGE2_BRAKING задаёт нулевую скорость и применяет a_stage2 до точной остановки.", + "- EMERGENCY_LATCHED выполняет ту же обязательную остановку, фиксируется и не снимается обычной командой.", + "- Свежая команда снимает только временные защитные состояния; старая и повторная команды таймер не обновляют.", + "- Предварительная реакция уменьшает скорость с возможностью мягкого восстановления, а обязательное торможение требует полной остановки.", + "", + "Порядок совпадающих событий", + "- Полностью полученная emergency-команда обрабатывается первой и фиксирует аварийную остановку.", + "- Полностью полученная свежая обычная команда обрабатывается раньше первого и второго порогов watchdog при одинаковом времени.", + "- Такая команда обновляет время свежести и отменяет переход, рассчитанный от предыдущей команды; затем очередь событий строится заново.", + "- Далее обрабатывается второй порог, затем первый; равные пороги запрещены проверкой ThresholdPolicy.", + "- Правило receive-before-threshold отдельно проверяется для обоих порогов.", + "", + "Параметры движения и эксперимента", + f"- Длительность опыта: {DURATION_SECONDS:.0f} с; команды: 20 Гц; a_resume={RESUME_ACCELERATION_MPS2:.1f} м/с².", + f"- Основная матрица: {len(CHANNEL_CONDITIONS)} каналов × {len(POLICIES)} политики × {len(SPEEDS_KMH)} скорости × {len(PROFILES)} профиля = {len(summaries)} сочетаний.", + f"- Условия с потерями: {REPETITIONS} повторов; контроль без потерь: один детерминированный опыт.", + "- Скорости: 5, 15 и 25 км/ч; внутри модели используются м/с.", + "- Профили a_stage1/a_stage2: мягкий 0,5/2,0; номинальный 1,0/3,0; интенсивный 1,5/4,0 м/с².", + "- Интегрирование событийное и точное на каждом участке постоянного ускорения; крупный фиксированный шаг не используется.", + "- Ранее сформированный каталог результатов Lab039 удалён; все CSV, TXT и PNG получены заново одним полным запуском окончательного кода.", + f"- Проверенные при построении нагрузки пакеты CRC/FEC: {workload.crc_packets_checked}/{workload.fec_blocks_checked}.", + "", + "Компактная сводка 180 сочетаний", + "политика | реакции этапа 1, 1/мин (среднее) | торможения этапа 2, 1/мин (среднее) | полные остановки, 1/мин (среднее) | максимальный полный путь, м", + ] + for policy in POLICIES: + rows = [row for row in summaries if row.policy == policy.name] + lines.append( + f"{POLICY_LABELS[policy.name]} | " + f"{_mean(row.preliminary_reactions_per_minute for row in rows):.4f} | " + f"{_mean(row.mandatory_brakings_per_minute for row in rows):.4f} | " + f"{_mean(row.full_stops_per_minute for row in rows):.4f} | " + f"{max(row.max_total_stop_path_m for row in rows):.4f}" + ) + lines.extend( + [ + "", + "Расширенная сводка политик", + "политика | этап 1 ср/макс, 1/мин | этап 2 ср/макс, 1/мин | остановки ср/макс, 1/мин | путь ср/макс/P95макс, м | время этап 1/этап 2/ноль, % | потеря скорости, м/с | восстановление, с", + ] + ) + for policy in POLICIES: + summary_rows = [row for row in summaries if row.policy == policy.name] + watchdog_rows = [row for row in watchdog if row.policy == policy.name] + distance_rows = [row for row in distances if row.policy == policy.name] + lines.append( + f"{POLICY_LABELS[policy.name]} | " + f"{_mean(row.preliminary_reactions_per_minute for row in summary_rows):.4f}/" + f"{max(row.preliminary_reactions_per_minute for row in summary_rows):.4f} | " + f"{_mean(row.mandatory_brakings_per_minute for row in summary_rows):.4f}/" + f"{max(row.mandatory_brakings_per_minute for row in summary_rows):.4f} | " + f"{_mean(row.full_stops_per_minute for row in summary_rows):.4f}/" + f"{max(row.full_stops_per_minute for row in summary_rows):.4f} | " + f"{_mean(row.mean_total_stop_path_m for row in distance_rows):.4f}/" + f"{max(row.max_total_stop_path_m for row in distance_rows):.4f}/" + f"{max(row.p95_total_stop_path_m for row in distance_rows):.4f} | " + f"{_mean(row.stage1_time_fraction for row in summary_rows) * 100.0:.4f}/" + f"{_mean(row.stage2_time_fraction for row in summary_rows) * 100.0:.4f}/" + f"{_mean(row.zero_speed_fraction for row in summary_rows) * 100.0:.4f} | " + f"{_mean(row.mean_short_speed_reduction_mps for row in watchdog_rows):.4f} | " + f"{_mean(row.mean_resume_time_seconds for row in watchdog_rows):.4f}" + ) + lines.extend( + [ + "", + "Сравнение 100/200 и 150/250 мс по выбранным условиям", + "канал | скорость, км/ч | политика | этап 1/этап 2/остановки, 1/мин | путь ср/макс/P95макс, м | время этап 1/этап 2/ноль, % | потеря скорости, м/с | восстановление, с", + ] + ) + comparison_conditions = ("260_200", "230_200", "230_1000") + condition_labels = {condition.name: condition.label for condition in CHANNEL_CONDITIONS} + for condition_name in comparison_conditions: + for speed_kmh in SPEEDS_KMH: + for policy_name in ("two_100_200", "two_150_250"): + summary_rows = [ + row + for row in summaries + if row.channel_condition == condition_name + and row.initial_speed_kmh == speed_kmh + and row.policy == policy_name + ] + watchdog_rows = [ + row + for row in watchdog + if row.channel_condition == condition_name + and row.initial_speed_kmh == speed_kmh + and row.policy == policy_name + ] + distance_rows = [ + row + for row in distances + if row.channel_condition == condition_name + and row.initial_speed_kmh == speed_kmh + and row.policy == policy_name + ] + lines.append( + f"{condition_labels[condition_name]} | {speed_kmh:.0f} | {POLICY_LABELS[policy_name]} | " + f"{_mean(row.preliminary_reactions_per_minute for row in summary_rows):.4f}/" + f"{_mean(row.mandatory_brakings_per_minute for row in summary_rows):.4f}/" + f"{_mean(row.full_stops_per_minute for row in summary_rows):.4f} | " + f"{_mean(row.mean_total_stop_path_m for row in distance_rows):.4f}/" + f"{max(row.max_total_stop_path_m for row in distance_rows):.4f}/" + f"{max(row.p95_total_stop_path_m for row in distance_rows):.4f} | " + f"{_mean(row.stage1_time_fraction for row in summary_rows) * 100.0:.4f}/" + f"{_mean(row.stage2_time_fraction for row in summary_rows) * 100.0:.4f}/" + f"{_mean(row.zero_speed_fraction for row in summary_rows) * 100.0:.4f} | " + f"{_mean(row.mean_short_speed_reduction_mps for row in watchdog_rows):.4f} | " + f"{_mean(row.mean_resume_time_seconds for row in watchdog_rows):.4f}" + ) + lines.extend( + [ + "- Полные данные каждой комбинации находятся в lab039_summary.csv, lab039_watchdog_metrics.csv и lab039_distance_metrics.csv.", + "", + "Путь и защитные реакции", + f"- Максимальный наблюдавшийся промежуток без свежей команды: {max(row.max_command_gap_ms for row in summaries):.3f} мс.", + f"- Максимальное время применения устаревшей команды до обязательного торможения: {max(policy.stage2_seconds for policy in POLICIES) * 1000.0:.0f} мс.", + f"- Максимальный путь до первой реакции: {max(row.max_distance_to_first_m for row in distances):.4f} м.", + f"- Максимальный путь до второго порога: {max(row.max_distance_to_second_m for row in distances):.4f} м.", + f"- Максимальный тормозной путь после второго порога: {max(row.max_braking_distance_m for row in distances):.4f} м.", + f"- Максимальный полный путь после последней свежей команды: {max(row.max_total_stop_path_m for row in distances):.4f} м.", + f"- Частота предварительных реакций: {min(row.preliminary_reactions_per_minute for row in summaries):.4f}…{max(row.preliminary_reactions_per_minute for row in summaries):.4f} 1/мин.", + f"- Частота полных остановок: {min(row.full_stops_per_minute for row in summaries):.4f}…{max(row.full_stops_per_minute for row in summaries):.4f} 1/мин.", + "- Произведение v × timeout описывает только путь до порога; после него ровер сохраняет скорость и проходит дополнительный тормозной путь.", + "- Путь реакции растёт линейно со скоростью, а идеализированный тормозной путь v²/(2a) — квадратично, поэтому высокая начальная скорость особенно существенна.", + "- Короткий первый порог чаще пересекается обычными краткими помехами и вызывает лишние замедления.", + "- Длинный второй порог дольше сохраняет движение до обязательного торможения и увеличивает полный путь.", + "", + "Аналитические контрольные расчёты без восстановления связи", + "скорость, км/ч | профиль | один порог: реакция/торможение/итого, м | 150/250: реакция/замедление/торможение/итого, м | разница, м | ошибка модели, м", + ] + ) + for row in analytics: + lines.append( + f"{row.initial_speed_kmh:.0f} | {PROFILE_LABELS[row.deceleration_profile]} | " + f"{row.single_reaction_path_m:.4f}/{row.single_braking_path_m:.4f}/{row.single_total_analytic_m:.4f} | " + f"{row.two_stage_reaction_path_m:.4f}/{row.two_stage_deceleration_path_m:.4f}/" + f"{row.two_stage_braking_path_m:.4f}/{row.two_stage_total_analytic_m:.4f} | " + f"{row.two_stage_minus_single_m:+.4f} | {row.maximum_absolute_error_m:.3e}" + ) + lines.extend( + [ + f"- Максимальная абсолютная ошибка событийной модели: {max(row.maximum_absolute_error_m for row in analytics):.3e} м.", + "", + "Независимая аварийная остановка", + f"- Расчёт: {len(emergencies)} сочетаний; emergency сформирована на 60-й секунде; политика локального таймера 150/250 мс.", + f"- Итоговая доставка за окно 500 мс: {min(row.delivered_fraction for row in emergencies) * 100.0:.3f}…{max(row.delivered_fraction for row in emergencies) * 100.0:.3f}%.", + f"- Время первой доставки: среднее до {max(row.mean_delivery_ms for row in emergencies):.3f} мс, P95 до {max(row.p95_delivery_ms for row in emergencies):.3f} мс, максимум {max(row.max_delivery_ms for row in emergencies):.3f} мс.", + f"- Путь за время доставки: до {max(row.mean_path_during_delivery_m for row in emergencies):.4f} м в среднем по сочетанию.", + f"- Тормозной путь после получения: до {max(row.mean_braking_distance_m for row in emergencies):.4f} м в среднем по сочетанию.", + f"- Полный путь от формирования до остановки: среднее до {max(row.mean_total_path_m for row in emergencies):.4f} м; максимум {max(row.max_total_path_m for row in emergencies):.4f} м.", + f"- Недоставок за 500 мс: {max(row.undelivered_by_500ms for row in representative_emergencies)} в одном канальном условии, {sum(row.undelivered_by_500ms for row in representative_emergencies)} суммарно в независимых транспортных опытах.", + f"- При недоставке доля опытов с включением второго этапа локального таймера: до {max(row.local_watchdog_stage2_fraction_when_undelivered for row in emergencies) * 100.0:.3f}%.", + f"- При недоставке доля остановок локальным таймером: до {max(row.local_watchdog_stop_fraction_when_undelivered for row in emergencies) * 100.0:.3f}%.", + f"- Средний путь локальной остановки при недоставке: до {max(row.mean_local_watchdog_path_when_undelivered_m for row in emergencies):.4f} м; время — до {max(row.mean_local_watchdog_stop_seconds_when_undelivered for row in emergencies):.4f} с.", + "- Удалённая emergency не заменяет локальный сторожевой таймер: канал может быть физически недоступен, а локальная реакция не зависит от доставки.", + "- ACK лишь прекращает будущие копии и информирует отправителя; торможение начинается при первом корректном emergency до получения ACK.", + "", + "Инварианты безопасности", + f"- Отрицательная скорость: {sum(row.negative_speed_cases for row in summaries)} случаев.", + f"- Превышение заданной скорости: {sum(row.target_speed_exceeded_cases for row in summaries)} случаев.", + f"- Второй порог превышен без торможения: {sum(row.missed_stage2_cases for row in summaries)} случаев.", + f"- Снятие временного состояния старой командой: {sum(row.stale_command_release_cases for row in summaries)} случаев.", + f"- Снятие аварийной остановки обычной командой: {sum(row.ordinary_command_emergency_release_cases for row in summaries)} случаев.", + "", + "Интерпретация пары 150/250 мс", + ] + ) + candidate_rows = [row for row in summaries if row.policy == "two_150_250"] + short_rows = [row for row in summaries if row.policy == "two_100_200"] + long_rows = [row for row in summaries if row.policy == "two_200_300"] + lines.extend( + [ + f"- Для 150/250 мс средняя частота предварительных реакций по матрице: {_mean(row.preliminary_reactions_per_minute for row in candidate_rows):.4f} 1/мин; полных остановок: {_mean(row.full_stops_per_minute for row in candidate_rows):.4f} 1/мин.", + f"- Для 100/200 мс соответствующие значения: {_mean(row.preliminary_reactions_per_minute for row in short_rows):.4f} и {_mean(row.full_stops_per_minute for row in short_rows):.4f} 1/мин; для 200/300 мс: {_mean(row.preliminary_reactions_per_minute for row in long_rows):.4f} и {_mean(row.full_stops_per_minute for row in long_rows):.4f} 1/мин.", + f"- Максимальный полный путь 150/250 мс: {max(row.max_total_stop_path_m for row in candidate_rows):.4f} м; 100/200 мс: {max(row.max_total_stop_path_m for row in short_rows):.4f} м; 200/300 мс: {max(row.max_total_stop_path_m for row in long_rows):.4f} м.", + "- Эти результаты характеризуют компромисс, но не подтверждают окончательный выбор: пороги и замедления автоматически не назначаются.", + "", + "Ограничения модели", + "- a_stage1 и a_stage2 являются исследовательскими параметрами и должны быть измерены на реальном ровере.", + "- Не моделируются уклон, пробуксовка, задержка электромеханического тормоза, изменение сцепления и сопротивление воздуха.", + "- Не моделируются поперечная динамика, перенос массы, ABS и фактическое время нарастания тормозного момента.", + "- Это расчётная одномерная модель, а не окончательный алгоритм силовой части и не замена натурных испытаний.", + "", + "Функциональные проверки", + ] + ) + lines.extend(f"- {'PASS' if item.passed else 'FAIL'} {item.name}: {item.detail}" for item in tests) + created = ( + Path("protocol/two_stage_failsafe.py"), + Path("tests/lab039_two_stage_braking.py"), + SUMMARY_CSV_PATH, + WATCHDOG_CSV_PATH, + DISTANCE_CSV_PATH, + EMERGENCY_CSV_PATH, + ANALYTIC_CSV_PATH, + REPORT_PATH, + *PLOT_PATHS, + ) + lines.extend(["", "Созданные файлы", *[f"- {path.as_posix()}" for path in created]]) + lines.extend( + [ + "", + "Состояние результатов", + "- Lab039 оставлена вне индекса Git и не закоммичена.", + "- Lab028–Lab038 не изменялись.", + "- Сохранены только компактные агрегированные CSV, TXT и PNG; запрещённые артефакты не создавались.", + ] + ) + REPORT_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def validate_outputs( + summaries: tuple[SummaryMetrics, ...], + watchdog: tuple[WatchdogMetrics, ...], + distances: tuple[DistanceMetrics, ...], + emergencies: tuple[EmergencyStopMetrics, ...], + analytics: tuple[AnalyticCheck, ...], + tests: tuple[FunctionalTestResult, ...], + watchdog_traces: dict[str, tuple[TransportTrace, ...]], + emergency_traces: dict[str, tuple[TransportTrace, ...]], +) -> None: + assert len(summaries) == len(watchdog) == len(distances) == 180 + assert len(emergencies) == 45 + assert len(analytics) == 9 + assert len(tests) == 22 and all(item.passed for item in tests), [item for item in tests if not item.passed] + assert all(len(watchdog_traces[item.name]) == item.repetitions for item in CHANNEL_CONDITIONS) + assert all(len(emergency_traces[item.name]) == item.repetitions for item in CHANNEL_CONDITIONS) + assert all(trace.negative_time_order == 0 for traces in watchdog_traces.values() for trace in traces) + assert all(trace.negative_time_order == 0 for traces in emergency_traces.values() for trace in traces) + assert max(row.maximum_absolute_error_m for row in analytics) < 1e-9 + assert sum(row.negative_speed_cases for row in summaries) == 0 + assert sum(row.target_speed_exceeded_cases for row in summaries) == 0 + assert sum(row.missed_stage2_cases for row in summaries) == 0 + assert sum(row.stale_command_release_cases for row in summaries) == 0 + assert sum(row.ordinary_command_emergency_release_cases for row in summaries) == 0 + + csv_paths = ( + SUMMARY_CSV_PATH, + WATCHDOG_CSV_PATH, + DISTANCE_CSV_PATH, + EMERGENCY_CSV_PATH, + ANALYTIC_CSV_PATH, + ) + expected_counts = (180, 180, 180, 45, 9) + for path, expected_count in zip(csv_paths, expected_counts): + assert path.is_file() and path.stat().st_size > 0, path + path.read_text(encoding="utf-8") + with path.open(newline="", encoding="utf-8") as file: + assert sum(1 for _ in csv.DictReader(file)) == expected_count, path + assert REPORT_PATH.is_file() and REPORT_PATH.stat().st_size > 0 + REPORT_PATH.read_text(encoding="utf-8") + for path in PLOT_PATHS: + assert path.is_file() and path.stat().st_size > 0, path + image = cv2.imread(str(path), cv2.IMREAD_UNCHANGED) + assert image is not None and image.size > 0 and image.shape[0] > 100 and image.shape[1] > 100, path + + expected_files = {path.resolve() for path in (*csv_paths, REPORT_PATH, *PLOT_PATHS)} + actual_files = {path.resolve() for path in OUTPUT_DIRECTORY.rglob("*") if path.is_file()} + assert actual_files == expected_files, sorted(str(path) for path in actual_files ^ expected_files) + forbidden_suffixes = {".jpg", ".jpeg", ".pyc", ".pickle", ".pkl", ".bin", ".zip"} + assert not any(path.suffix.lower() in forbidden_suffixes for path in actual_files) + assert not any(path.name == "__pycache__" for path in OUTPUT_DIRECTORY.rglob("*")) + + +def main() -> None: + OUTPUT_DIRECTORY.mkdir(parents=True, exist_ok=True) + workload = build_lab038_workload() + ( + summaries, + watchdog, + distances, + emergencies, + analytics, + watchdog_traces, + emergency_traces, + ) = run_experiment(workload) + tests = run_functional_tests(workload, watchdog_traces, emergency_traces) + _write_csv(SUMMARY_CSV_PATH, SummaryMetrics, summaries) + _write_csv(WATCHDOG_CSV_PATH, WatchdogMetrics, watchdog) + _write_csv(DISTANCE_CSV_PATH, DistanceMetrics, distances) + _write_csv(EMERGENCY_CSV_PATH, EmergencyStopMetrics, emergencies) + _write_csv(ANALYTIC_CSV_PATH, AnalyticCheck, analytics) + save_plots(summaries, watchdog, distances, emergencies, analytics) + write_report(workload, summaries, watchdog, distances, emergencies, analytics, tests) + validate_outputs( + summaries, + watchdog, + distances, + emergencies, + analytics, + tests, + watchdog_traces, + emergency_traces, + ) + print(f"Lab039 complete: {len(summaries)} combinations, lossy repetitions={REPETITIONS}") + for item in tests: + print(f"{'PASS' if item.passed else 'FAIL'} {item.name}: {item.detail}") + + +if __name__ == "__main__": + main()