Машинний переклад, не перевірений носієм мови. Еталоном є англійська версія.

СценаріїРедагувати на GitHubДжерело: docs/CAMPAIGNS.md

Кампанії

Один сценарій відповідає на одне запитання про одну ситуацію. Місія — це послідовність ситуацій, а дослідження проєкту — їхня родина. Вид сценарію campaign компонує наявні види в один прогін, не реалізуючи жодного з них наново: кожен учасник — це звичайна таблиця сценарію з власним kind, що диспетчеризується через api::run_toml саме так, як її запустив би kshana <file>.toml, а кампанія лише зчитує числа з документів результатів.

Кампанія — MODELLED. Її тотожності композиції перевіряються (нижче), але зчеплення фаз — вибір моделювання, і кожна фаза настільки добра, наскільки добрий вид, що її запустив.

Запустіть її, як будь-який інший сценарій:

kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file

Кампанія може містити будь-яку комбінацію чотирьох розділів; та, що не має жодного, запускається, а її підсумок повідомляє, що вона нічого не скомпонувала.

[[phases]]: зчеплена місія на одній часовій шкалі#

Кожна фаза запускає один або кілька сценаріїв у вікні спільної часової шкали місії, наприклад годинник у holdover та інерціальну навігаційну систему (INS), що одночасно рухається за інерцією. Виходи кожного прогону зчитуються в іменовані канали, розміщуються на час початку фази й передискретизуються на спільну сітку ([timeline] step_s) утриманням нульового порядку: час сітки бере останній відлік прогону відповідної фази, що не пізніший за нього, і дорівнює null там, де жоден прогін цієї фази не надає каналу.

Канал Одиниця Що це Джерело пресета
time_error_ns нс похибка часу годинника clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns
guard_ns нс запобіжник похибки часу власний threshold_ns прогону
cn0_dbhz dB-Hz середнє ефективне відношення несівної до густини шуму (C/N0) за видимими супутниками jamming: середнє від epochs[].sats[].cn0_effective_dbhz
cn0_floor_dbhz dB-Hz поріг втрати відстеження jamming: tracking_threshold_dbhz сценарію, якщо він його задає
tracking кількість супутники, що ще відстежуються jamming: epochs[].tracking
protection_level_m m вертикальний рівень захисту integrity: epochs[].vpl_m
alert_limit_m m вертикальна межа тривоги integrity: al_v_m
position_error_m m похибка положення gnss-ins: <side>.series[].error_m
position_threshold_m m поріг похибки положення gnss-ins: threshold_m
alarm 1 1, поки спрацьовує будь-який монітор фази див. нижче

<side> — це classical, якщо прогін не задає side = "quantum". Будь-яка інша величина зчитується явним записом [[phases.runs.series]]: часовий шлях з одним [], що називає рядки (epochs[].t), шлях значення, що ділить ті самі рядки, або скаляр, розповсюджений на кожен рядок (префікс input: зчитує сценарій прогону, а не його результат), необов'язкове згортання (mean, min, max, count) для кількох значень під одним рядком, масштаб і одиниця для каналу, якого кампанія не знає.

Тривоги надходять із трьох джерел, що поєднуються логічним АБО в межах фази:

  • прапорці пресета, зчитані з прогону: jamming сигналізує, поки відстежується менше чотирьох супутників (власне визначення доступності); integrity сигналізує на епохах, які позначає як недоступні;
  • правила пресета на каналах фази, що обчислюються після carry: clock сигналізує, поки абсолютна похибка часу перевищує guard_ns; gnss-ins — поки похибка положення перевищує position_threshold_m; явні правила розміщуються в [[phases.runs.alarms]];
  • події-тривоги: spoof породжує одну на detect_time_s свого монітора з допомогою годинника; spoof-detect породжує одну на початку фази, коли його злите рішення сигналізує.

Стан передається далі між фазами трьома явними способами:

  • carry = ["time_error_ns"] додає значення каналу на кінець попередньої фази до значень цього каналу в цій фазі. Фаза годинника, яку зсунув спуфер, — це місце, звідки починається holdover. Додавання зсуву точне для фази годинника, що інтегрує частоту; для похибки положення воно припускає, що дві похибки колінеарні, — песимістичний випадок.
  • [[phases.handoff]] записує число з попередньої фази (channel:<name> для кінцевого значення каналу або будь-який шлях результату попереднього прогону) у ключ із крапками сценарію цієї фази перед його запуском, з необов'язковими масштабом і зсувом.
  • end_at = "<result path>" завершує фазу в момент, обчислений прогоном, з обмеженням duration_s. Вбудована місія завершує свою фазу спуфінгу на classical.detect_time_s.

skip_s відкидає перші секунди власної часової шкали прогону (прогрів) до нульового часу фази.

Вбудована місія#

scenarios/campaign-jam-spoof-holdover-integrity.toml запускає 18 сценаріїв-учасників у шести фазах на сітці 10 с:

Фаза Прогони Що показує часова шкала
номінально, 600 с clock, jamming (без глушника), integrity похибка часу 0 нс; C/N0 43,0 dB-Hz проти порогу 25 dB-Hz; вертикальний рівень захисту від 9,1 до 21,6 м проти межі тривоги 50 м
глушіння, 600 с те саме, глушник на -30 dBW, 1 км C/N0 падає до 27,7 dB-Hz, усі 8 супутників досі відстежуються
спуфінг, завершений на 370 с за допомогою end_at spoof (лінійний дрейф часу 0,1 нс/с), spoof-detect, jamming похибка часу зростає до 36 нс; радіочастотний детектор сигналізує на початку фази, монітор з допомогою годинника — на 370 с
holdover, 1800 с clock (відмовлений, переносить 37,0 нс), gnss-ins (тактичний блок, що рухається за інерцією), jamming на 10 dBW втрачено всі супутники (C/N0 приблизно -12 dB-Hz); похибка часу від 36,4 до 62,7 нс проти запобіжника 50 нс; похибка положення до 24 км
integrity-alarm, 600 с clock (переносить 59,6 нс), jamming і integrity з маскою 25 град відстежується 5 супутників; рівень захисту від 19 до 135 м, відсутній у 18 із 60 моментів сітки; перенесена похибка часу, від 52,1 до 61,7 нс, лишається вище запобіжника 50 нс, тож тривога триває протягом усієї фази
відновлення, 600 с clock, jamming (без глушника), integrity похибка часу повернулася до 0 нс; тривога вщухла

Прогони цілісності використовують власну трасу користувача з прикладу integrity (кругова траса на висоті 0,4 км), а не фіксований пункт приймача глушіння, а маска 25 град заступає частково відкрите небо приймача, що повторно захоплює сигнал. Це вибори сценарію, зазначені у файлі.

Місія, керована спектром L-діапазону#

scenarios/campaign-spectrum-holdover-integrity.toml запускає 8 сценаріїв-учасників у трьох фазах на сітці 1 с, причому C/N0 для GPS L1 C/A і Galileo E1 зчитується з виду spectrum (див. SPECTRUM.md), а не з таблиці за супутниками виду jamming. Глушники — ті, що в scenarios/l-band-waterfall-jamming.toml.

Фаза Прогони Що показує часова шкала
початок, завершений на 10 с за допомогою end_at clock, spectrum (чирп від 10 с), integrity L1 C/A 43,48 і E1 44,73 dB-Hz; фаза завершується на першій втраті L1 C/A у власному прогоні спектра (timeline.bands[0].first_loss_t_s); рівень захисту 21,6 м проти 50 м
holdover, 600 с clock (відмовлений, переносить похибку початку, тут 0 нс), spectrum (чирп увімкнено) L1 C/A 3,38 і E1 4,44 dB-Hz, обидва нижче порогу 25 dB-Hz; похибка часу від -0.07 до 5,06 нс проти запобіжника 50 нс; тривога триває
galileo-fallback, 300 с clock (повторно синхронізований), spectrum (тон CW на несівній L1), integrity на Walker 24/3/1 типу Galileo L1 C/A утримується на 17,98 dB-Hz, E1 повернувся до 44,73 dB-Hz; рівень захисту від 6,1 до 17,7 м; тривога вщухла

Відновлення E1 під тоном CW ґрунтується на обробці безперервного спектра у виді «спектр»: тон потрапляє в нуль спектра MBOC і нічого не зв'язує. Реальний тон зв'язувався б через спектральні лінії коду; це зазначено у файлі та в SPECTRUM.md.

[sweep]: сітка параметрів для будь-якого виду#

Від одного до трьох ключів сценарію з крапками, кожен у лінійному або логарифмічному діапазоні, на тих самих значеннях осі, що й вид sweep-nd. Кожна вісь має назву й одиницю; кожна метрика має назву та шлях результату, а її одиницю зчитано з власного блоку одиниць досліджуваного виду, якщо кампанія не оголошує іншу. За runs > 1 кожен вузол — це засіяний ансамбль Монте-Карло (реалізація k на зерні вузла плюс k), який подається зі статистикою нижче. scenarios/campaign-sweep-jammer-power.toml перебирає глушник на 1 км від приймача від -50 до +10 dBW: середнє відношення глушника до сигналу змінюється рівно на 1 dB на dB (від 12,2 до 72,2 dB), а доступність падає від 1 до 0 між -30 і -25 dBW.

Ключ із крапками може індексувати масив таблиць за позицією: system.2.sisre_m — це sisre_m третьої таблиці [[system]], а case.0.system.0.shell.0.altitude_km сягає на три рівні вглиб.

[monte_carlo]: засіяний ансамбль#

Реалізація k запускає сценарій із ключем зерна, встановленим у base_seed + k, за конвенцією, яку вже використовує ансамбль годинників, тож ансамбль відтворюється точно. Кожна метрика повідомляє середнє, популяційне стандартне відхилення, перцентилі 5, 50 і 95 за методом найближчого рангу, 95-відсотковий довірчий інтервал для середнього, побудований перцентильним бутстрепом із фіксованим зерном (2000 перевибірок), і, типово, кожен відлік у порядку зерен. Шляхи результатів можуть індексувати масиви: classical.series[-1].error_ns — це останній відлік.

[compose]: кілька сценаріїв за спільних умов#

Іменовані спільні значення (число або масив чисел, з одиницею) записуються в кожного учасника за ключами, до яких він їх прив'язує, тож учасники не можуть розходитися щодо спільної умови. Кожен учасник запускається, а для кожної метрики зведений підсумок дає найменше, найбільше та середнє значення серед учасників із зазначенням найкращого й найгіршого. scenarios/campaign-shared-jammer-sea-road.toml ставить один глушник на 8 dBW між судном у Фінській затоці (приблизно 30 км) і автомобілем на прибережній дорозі Гельсінкі (приблизно 50 км): судно втрачає кожен супутник (середнє відношення глушника до сигналу 39,0 dB), тоді як автомобіль зберігає щонайменше чотири (34,6 dB).

[optimize]: найкраще значення однієї метрики#

Від одного до трьох ключів сценарію з крапками, кожен обмежений до [lo, hi] на шкалі lin або log, шукаються за найкращим значенням однієї метрики (goal = "minimize", "maximize" або "target", що мінімізує відстань від target).

Є два методи:

  • method = "grid" запускає кожен вузол сітки з steps на ключ, за значеннями осей перебору.
  • method = "nelder-mead" (типовий) запускає детермінований симплекс Нелдера–Міда в координатах, нормованих до [0, 1] на ключ. Пробні точки проєктуються на коробку. Розділ приймає max_evals, початковий step і допуски зупинки ftol та xtol.

Прогін, чия метрика відсутня або нескінченна, оцінюється найгірше і зберігається в трасі. За runs > 1 метрика — це середнє за тими самими зернами на кожному обчисленні. Результат містить best_coords, best_metric, best_score, evals, stop_reason і кожне обчислення в trace.

scenarios/campaign-optimize-link-budget.toml шукає дальність і швидкість передавання даних для запасу лінії зв'язку 3 dB. Оптимум є локальним щодо коробки та початку. Він MODELLED і ніколи не є глобальним твердженням.

Протокол і його попередньо зареєстровані пороги — у docs/design/evidence/cap32-optimize/. Тест — tests/campaign_optimize_reference.rs. Результати:

  • розв'язання цілі 1-D збігається із замкненою формою з точністю 6e-15;
  • метод сітки збігається побітово з незалежним циклом повного перебору;
  • симплекс працює щонайменше не гірше за сітку 41 × 41 приблизно за десяту частину її прогонів.

Поріг 1-D раунду 1 зафіксовано як NOT MET: попередньо зареєстрована коробка виключала розв'язок.

Відтворюваність#

Кожен результат кампанії містить scenario_hash, SHA-256 (Secure Hash Algorithm 2, 256-бітовий дайджест) канонічної форми JavaScript Object Notation (JSON) документа кампанії (порядок ключів і форматування на нього не впливають), і блок reproducibility із кількістю прогонів учасників та run_digest — SHA-256 за дайджестами результатів усіх учасників у порядку диспетчеризації. Два прогони з однаковим дайджестом дали побайтово ідентичні результати учасників. Кожен прогін фази також записує свій вид, власний scenario_hash, якщо в виду він є, і SHA-256 документа свого результату. Кожне число в документі має запис одиниць.

Ядро послідовне й не читає файлів, тож кампанія запускається без змін у збірці WebAssembly. Кампанії не можуть містити кампанії.

Експорт#

--export для кампанії записує кожного учасника-сценарій, що має геометрію, як власний набір файлів, з міткою учасника перед суфіксом формату: кожен прогін фази (<phase>, або <phase>-<k>, коли фаза має кілька прогонів), базовий сценарій перебору (sweep), сценарій Монте-Карло (monte-carlo) і кожен складений учасник (власна мітка, із записаними спільними значеннями, які він прив'язує). Учасник, ідентичний попередньому, записується один раз; передачі між фазами та значення перебору чи зерна, застосовані під час виконання, в експортованих сценаріях відсутні.

kshana scenarios/campaign-shared-jammer-sea-road.toml --export kml
# after the usual result, chart and report files:
# wrote scenarios/campaign-shared-jammer-sea-road.ship-strait.kml
# wrote scenarios/campaign-shared-jammer-sea-road.car-coast-road.kml

Формат, який не може описати жоден з учасників, відхиляється з указанням цієї причини. Таблицю для кожного сценарію наведено в INTEROP.md.

Кампанії LEO-PNT#

П'ятнадцять вбудованих кампаній формулюють питання позиціонування, навігації та часу (PNT) на низьких навколоземних орбітах (LEO); LEO-PNT.md описує, що показує кожна з них. Що запускає кожна, у підсумку командного рядка:

Сценарій Режим Питання
leo-focus-data-services.toml композиція, 4 учасники дані служби навігаційних повідомлень проти довжини кадру
leo-focus-fused-pnt-sisre.toml перебір leo-pvt, 7 вузлів злите позиціонування MEO і LEO проти похибки дальності сигналу в просторі (SISRE) LEO
leo-focus-indoor-uhf.toml композиція, 2 учасники LEO-PNT у приміщенні за діапазоном і класом будівлі
leo-focus-iot-eirp.toml перебір leo-pass, 9 вузлів енергія Інтернету речей (IoT) на одне визначення проти потужності передавача LEO UHF
leo-focus-ntn-bandwidth.toml перебір ntn-positioning, 9 вузлів позиціонування в нетерестріальних мережах (NTN) проти смуги опорного сигналу
leo-focus-ppp-altitude.toml перебір leo-ppp, 3 вузли збіжність прецизійного точкового позиціонування (PPP) проти висоти шару LEO зі 192 супутників
leo-resilience-gnss-jammed-leo-carries.toml ланцюг, 3 фази за 2100 с глобальна навігаційна супутникова система (GNSS) заглушена, шар LEO веде користувача, цілісність збережено
leo-resilience-multiband-diversity.toml перебір spectrum, 13 вузлів різноманітність діапазонів LEO проти загороджувального глушника L-діапазону
leo-resilience-spoof-monitors.toml композиція, 4 учасники монітори спуфінгу проти чотирьох спуферів
leo-vertical-5g-network-timing.toml ланцюг, 1 фаза за 86 400 с синхронізація базових станцій 5G: holdover і час LEO
leo-vertical-asset-tracking-iot.toml ланцюг, 3 фази за 1440 с відстеження контейнерів через LEO UHF: енергія на одне визначення вздовж подорожі
leo-vertical-autonomous-vehicle.toml ланцюг, 2 фази за 1500 с автономний транспортний засіб у міському каньйоні з шаром LEO
leo-vertical-autonomous-vehicle-skyline.toml ланцюг, 2 фази за 1800 с той самий міський каньйон як плоске відсічення 35 град і як обрій city-street
leo-vertical-critical-infrastructure-timing.toml ланцюг, 2 фази за 87 000 с синхронізація критичної інфраструктури: holdover із часом LEO
leo-vertical-polar-arctic.toml ланцюг, 3 фази за 10 800 с полярні та арктичні користувачі з полярним шаром LEO
leo-vertical-rail-maritime.toml ланцюг, 3 фази за 2520 с залізничні та морські користувачі з шаром LEO

MEO — середня навколоземна орбіта, UHF — ультрависока частота, а 5G — п'яте покоління мобільних мереж.

Що перевіряється#

tests/campaign_composition_reference.rs фіксує тотожності композиції:

  • Однофазна кампанія відтворює окремий прогін побітово. Для clock, integrity і jamming документ результату учасника побайтово ідентичний run_toml для файлу сценарію, його дайджест — той, що повідомляє кампанія, а за сітки з власним кроком прогону кожне вирівняне значення дорівнює значенню окремого ряду (C/N0 глушіння дорівнює середньому, обчисленому незалежно за окремим документом).
  • Однонодовий перебір і композиція з одного учасника зчитують точно те саме число, що й окремий прогін.
  • Ансамбль із фіксованим зерном побайтово стабільний, а реалізація k — це точно окремий прогін на seed + k; хеш кампанії не залежить від порядку ключів.
  • Аналітичний випадок. scenarios/campaign-monte-carlo-clock-holdover.toml запускає 200 зерен чип-масштабного атомного годинника лише з білим шумом частоти (q_wf = 9e-20 с^2/с, Microchip SA.45s sigma_y(1 с) = 3e-10), синхронізованого до 590 с і що рухається за інерцією до 3600 с. Кінцева похибка часу гаусова із середнім 0 і стандартним відхиленням sqrt(q_wf * 3010 с) = 16,459 нс (блукання фази за білого шуму частоти, Технічна нота 1337 Національного інституту стандартів і технологій (NIST)). Повідомлений інтервал, [-2.52, 1,59] нс, містить істинне середнє 0; вибіркове стандартне відхилення, 14,93 нс, дає статистику хі-квадрат 164,5 за 199 ступенів вільності, всередині двостороннього 99-відсоткового інтервалу [151,37, 254,14]. За 3000 зерен той самий сценарій дає 16,31 нс.
  • Ланцюг, керований спектром, зчитує числа окремих прогонів: фаза початку триває точно стільки, скільки час першої втрати у прогоні спектра, а кожне значення L1 C/A та E1 на часовій шкалі дорівнює, з точністю до 1e-9 dB, рядку окремого прикладу водоспаду для того самого стану глушника (номінальний, лише чирп, лише тон CW).
  • Ланцюг передає стан далі, як задокументовано: фаза спуфінгу триває точно стільки, скільки час виявлення прогону спуфінгу, holdover переносить точно зсув прогону спуфінгу на момент виявлення, відновлення не переносить нічого, а тривога триває всюди, де рівень захисту відсутній або перевищує межу тривоги.

Ці перевірки показують, що композиція не змінює нічого, що не повинна. Вони не підтверджують зчеплену місію порівнянням із виміряною, тому три рядки кампаній у VERIFICATION-MATRIX.md мають рівень MODELLED.