Python-API
Kshana leveres med et førsteklasses Python-grensesnitt (API – application programming interface), bygget med PyO3 og maturin. abi3-hjulene bygges mot det stabile binærgrensesnittet (ABI) til Python, slik at ett hjul per plattform fungerer på tvers av CPython ≥ 3,9; hjulene dekker Linux, macOS og Windows, hver på x86-64 og 64-biters ARM (se WHEEL_TAGS.md). En medfølgende typestubb (kshana.pyi + py.typed) gir editorer og mypy/pyright full typeinformasjon.
pip install kshana # from the Python Package Index, PyPI (release wheels)
# or, from a checkout:
pip install maturin && maturin develop --features python
Hurtigstart#
Kjør disse utdragene fra roten av en utsjekket kopi av depotet: de leser scenariofiler under scenarios/. NumPy-linjen trenger pip install numpy.
import kshana
toml = open("scenarios/clock-holdover.toml").read()
# Typed result with a parsed-dict accessor:
out = kshana.run_typed(toml)
print(out.summary)
data = out.data() # a Python dict — no JSON re-parsing
fom = data["quantum"]["fom"] # figures of merit, quantum side
classical_fom = data["classical"]["fom"] # … and the classical baseline
print(out.json[:80], "...") # raw JSON also available
open("chart.svg", "w").write(out.svg) # the chart SVG
# NumPy arrays straight from the result (NumPy is imported on call; it is not a
# dependency of the package):
curve = out.columns("quantum.adev_curve") # {"tau_s": ndarray, "adev": ndarray, ...}
adev = curve["adev"]
everything = out.series() # every record series, keyed by path
Flate#
| Symbol | Signatur | Returnerer |
|---|---|---|
run_typed |
(toml: str) -> RunOutput |
typet resultat (.json, .svg, .summary, .csv, .data(), .array(), .columns(), .series(), .write_csv()) |
run |
(toml: str) -> str |
resultatdokumentet som en JSON-streng (JavaScript Object Notation) |
run_full |
(toml: str) -> tuple[str, str, str] |
(json, svg, summary) |
scenario_kinds |
() -> list[dict] |
tilgjengelige scenariotyper + metadata (parset) |
list_kinds |
() -> str |
de samme metadataene som ÉN JSON-tabellstreng, ikke en liste (beholdt for eksisterende kallere; bruk scenario_kinds for den parsede listen) |
validate_toml |
(toml: str) -> list[str] |
feilmeldinger (tom hvis gyldig) |
error_kind |
(toml: str) -> str | None |
merkelapp for feilkategori (invalid_input, non_convergence, unsupported eller io_error), eller None ved suksess |
version / __version__ |
() -> str / str |
motorversjon |
receiver_trust |
(toml: str) -> RunOutput |
vurder en ekte mottakerlogg beskrevet av et receiver-trust-scenario: resultatdokument, tillits-CSV per epoke, diagram og sammendrag; en [platform] kind = "vessel"-tabell legger til de maritime overvåkingene og tillitsscoren 0-100 med begrunnelser (veiledende) |
receiver_trust_replay |
(session_toml, nmea) -> dict |
et avgrenset NMEA-utdrag skåret slik live-modus skårer det: tilstand per epoke, score 0-100 og begrunnelser, et sammendrag (ingen socket, ingen gate; veiledende) |
assess_vessel_log |
(session_toml, log) -> dict |
et fartøys NMEA-logg som en batchkjøring: scoremodellen og hver epokes score med fradragene (veiledende) |
jammertest_import |
(catalog_json, plans, log_start_utc, location=None, local_offset_h=2.0, year=None) -> dict |
den publiserte katalogen og planen for Jammertest som hendelser med planlagt fasit (events_toml, events); planlagte tidsluker, ikke registrerte sendetider |
jammertest_score |
(session_toml, log, catalog_json, plans, location=None, local_offset_h=2.0, log_start_utc=None, year=None, recover_hold_s=10.0, guard_s=60.0) -> dict |
en mottakerlogg skåret mot denne planen: latens per test, bom, tid til gjenoppretting, falske alarmer (MODELLED; en signert pakke krever kommandolinjen) |
evidence_create |
(session_toml, log, from_s, to_s, title=None, created_utc=None, seed_hex=None) -> dict |
en signert bevispakke for et vindu av loggen, i minnet: files, public_key, seed_hex (hold den privat); en teknisk registrering, ikke en juridisk vurdering |
evidence_verify |
(files, public_key=None, full_log=None, require_timestamp=False) -> dict |
verifiser en pakke: hasher, kjede, signatur, eventuelt den betrodde signereren, hele loggen og et tidsstempel; verdict er verified, intact-signer-not-pinned (ingen offentlig nøkkel oppgitt: intakt, signereren ikke fastslått) eller failed |
export_sp3, export_omm, export_oem |
(toml) -> str |
CLI-ens --export-sp3/-omm/-oem-artefakter som tekst |
export_formats |
(toml) -> list[dict] |
hvilke interoperabilitetsformater som gjelder for et scenario, uten å kjøre det |
export_scenario |
(toml, format) -> dict |
czml, kml, geojson, stk eller sigmf i minnet: {format, spec_url, files}, hver fil {suffix, bytes, sha256, encoding, content} (utf-8-tekst eller base64) |
import_route |
(toml, geojson) -> str |
en GeoJSON-rute skrevet inn i et scenario med veipunktspor (--import-route) |
animate_scenario |
(toml, format="svg", fps=None, duration_s=None, width=None) -> dict |
kjøringens tidsserier som en animert SVG, en HTML-spiller eller opptil 120 SVG-bilder: {summary, files} |
list_examples, get_example |
(kind=None) -> dict, (name) -> str |
de medfølgende referansescenarioene og deres TOML |
evidence_attach_timestamp |
(files, token, replace=False) -> dict |
bind et RFC 3161-token (bytes eller base64) til en pakke i minnet: {files, notes}; pakken må fortsatt verifiseres; autoritetens signatur kontrolleres ikke |
evidence_keygen |
() -> dict |
en ny signeringsnøkkel i minnet: seed_hex (PRIVAT), public_key, fingerprint, warning; bare Python |
iq_sweep |
(i, q, fs_hz, signal, prns, ..., pll_bws=None, dll_bws=None, spacings=None, coherents=None, design=None) -> dict |
spill av ett opptak på nytt over sløyfeutforminger (iq sweep): per utforming og PRN stabil jitter, låsandeler og C/N0; én innhenting per PRN, hver kanal på de samme sampelene |
iq_info, iq_inventory |
(path, hash=False) -> dict, (directory, recursive=False, hash=False) -> list |
beskriv ett opptak, eller hvert opptak i en mappe (leser filer; hash leser dem fullt ut) |
bench_export |
(toml, epoch=None) -> dict |
et scenarios kjøretøybevegelse og hendelser for en GNSS-simulator i laboratorium, i minnet: {files: {suffix: text}, notes, notice}; typene gnss-ins, jamming, gnss-sim; ingen signal skrives, behold notice sammen med filene |
compliance_report |
(runs) -> dict |
kartleggingen mot offentlige rammeverk fylt ut fra resultattekster: runs er en liste av {label, result, scenario?}-dicter (tekst, høyst 64); returnerer {report, markdown}; hver rads status sier at kjøringene gir belegg for funksjonene dens, ikke at et rammeverk er innfridd; ta med report["statement"] ved enhver visning |
compliance_mapping |
(sources=False) -> str |
de statiske kartleggingstabellene (eller kildedokumentene) som Markdown, med erklæringen først |
standards_pack_list |
() -> dict |
standardpakkene (id, tittel, rammeverk, antall tester) og en merknad; en pakke måler modellerte scenarioer mot terskler som er fastsatt før kjøringen |
standards_pack_run |
(pack_id) -> dict |
én pakkekjøring: hver test MET, NOT MET eller NEEDS INPUT med målte og forventede verdier, pluss rapporten som Markdown under markdown; kaster ValueError for en ukjent id |
lunanet_afs_check_spec |
() -> dict |
LunaNet AFS-implementasjonen kontrollert mot de trykte tabellene og de gjennomarbeidede eksemplene i LSIS-AFS V1.0 (terskler B1 til B10; B4 rapporterer én fastsatt bom) |
lunanet_afs_check_symbols |
(symbols, max_sp_errors=0) -> dict |
en AFS-symbolstrøm (tekst med 0 og 1) kontrollert for synkroniseringsmønster, SB1-dekoding, FID, TOI-kontinuitet og avstand; LDPC og CRC-24Q for delrammene 2 til 4 verifiseres ikke |
lunanet_afs_generate |
(frames=1, toi0=0) -> str |
en testsymbolstrøm med plassholder-delrammer (ikke en bølgeform) |
evidence_round_trip |
(scoring_toml, scenario_toml, conditions, log, from_s, to_s, title=None, created_utc=None, seed_hex=None) -> dict |
den signerte laboratoriepakken for rundtur som kobler scenario, testbetingelser (docs/spec/TEST-CONDITIONS.md), mottakerlogg og score med hash; som evidence_create |
bench_score |
(truth_json, predictions_json, threshold=None) -> str |
en kshana-bench-resultatfil (JSON-tekst) fra en fasitfil og en prediksjonsfil; MODELLED |
bench_leaderboard |
(results: list[str]) -> str |
kshana-bench-resultatfiler gjengitt som den statiske ledertavlesiden (HTML) |
osnma_verify |
(data, format="", start_gst=None, merkle_root_hex="", public_keys=None, reference_time=None, max_time_error=None) -> dict |
Galileo OSNMA-autentisering av I/NAV-sider eller en UBX-strøm i minnet: dicten kshana osnma verify --json skriver ut, med den veiledende merknaden i feltet advisory; bare veiledende, ikke en tjeneste for navigasjonsintegritet |
sky_geometry |
(request) -> dict |
satellittene et sted ser under en azimutavhengig horisontlinje: per satellitt visible / masked, GDOP, PDOP, HDOP, VDOP, TDOP, øst–nord–opp-kofaktoren og -kovariansen og de horisontale feilellipsene; request er JSON- eller TOML-tekst eller en dict (site, time_s, systems, tle, satellites, mask_deg, skyline, clock, sigma_uere_m, confidence); avgjørelsen om synlighet og ellipsen er kontrollert mot uavhengige biblioteker, resten er MODELLED, og resultatet bærer den veiledende merknaden (sky_source, sky_statement sier om horisonten er representativ eller fra elementsett) |
sky_monte_carlo |
(request, seed=0, n=1000) -> dict |
n (1 til 5000) minstekvadratfeil med seed på den synlige mengden i request, med deres empiriske kovarians, RMS og andelen innenfor 95 %-ellipsen |
skyline_presets |
() -> list[dict] |
horisontlinjenes forhåndsinnstillinger (city-street, harbour-approach, fjord, container-terminal) med merkelappen REPRESENTATIVE, proveniens og kuttet for hver grad av azimut; representative geometrier, ikke oppmålinger |
skyline_profile |
(skyline) -> dict |
en horisontlinjeseksjon (tabell, gatekløft, sektorer, terreng) redusert til den normaliserte tabellen med 360 oppføringer som motoren bruker |
skyplot_svg |
(request) -> str |
skyplottet for request som statisk SVG-tekst |
trust_telemetry |
(input, format, host="", input_kind="jsonl", expose_position=False, syslog_all=False, unix_nano=0) -> str |
en tillitsstrøm (jsonl) eller receiver-trust-resultat som Prometheus-tekst, CEF- eller LEEF-syslog-linjer eller en OTLP-JSON-nyttelast, med kodererne i kshana trust-telemetry; ingenting sendes og ingen klokke leses (syslog-linjer har ikke tidsstempel) |
interference_map |
(source, csv, dataset, cell_deg=None, licence=None, licence_url=None, attribution=None, land_geojson=None) -> list[dict] |
et GNSS-interferenskart fra ADS-B- eller AIS-CSV-tekst: én dict per UTC-døgn med kshana-interference-map/v1 GeoJSON (bare aggregert; en degradert celle peker ikke ut interferens som årsak) |
interference_emitter_regions |
(source, csv, dataset, licence=None, licence_url=None, attribution=None, land_geojson=None) -> dict |
estimerte senderområder fra ADS-B- eller AIS-CSV-tekst: {stem, geojson, summary, csv, svg, sessions_published, sessions_withheld}, hver merket MODELLED; områder ved oppgitt konfidens med et tyngdepunkt og en usikkerhetsellipse, aldri et bart punkt; bare aggregert, og et område er ikke posisjonen til noen og heller ikke et funn om årsaken |
route_exposure |
(route, maps, date_from=None, date_to=None) -> str |
andel av en rute gjennom degraderte celler i disse kartene, som JSON-tekst (ikke en prognose; celler uten observasjoner er ikke belegg for en klar rute) |
nmea_training |
(toml, seed=None) -> dict |
syntetisk NMEA fra broen til mannskapstrening pluss instruktørloggen (nmea, log_json, log_text); bare tekst, aldri til et fartøys levende navigasjonssystemer |
iq_signals |
() -> list[str] |
GNSS IQ-signalnavnene som iq_scene, iq_acquire og iq_track godtar (gps-l1ca, galileo-e1b, glonass-l1of, ...) |
iq_scene |
(fs_hz, duration_s, signal, prns, **options) -> dict |
en GNSS IQ-scene med flere satellitter i minnet: samples_i / samples_q og truth per epoke |
iq_scene_broadcast |
(fs_hz, window_s, nav_text, rx_lat, rx_lon, rx_alt, **options) -> dict |
det samme, med hver GPS-satellitt i geometrien fra sin kringkastede efemeride, fra en RINEX-navigasjonsmelding (Receiver Independent Exchange Format) |
iq_acquire |
(i, q, fs_hz, signal, prns, **options) -> list[dict] |
FFT-innhenting (fast Fourier transform) av hver PRN (pseudorandom noise code): Doppler, kodefase, statistikk, terskel |
iq_acq_surface |
(i, q, fs_hz, signal, prn, **options) -> dict |
hele innhentingsflaten til én PRN (kshana.acq-surface/1): rows[doppler][lag] korrelasjonseffekt, toppen og to finere Doppler-forbedringer (parabolic, fine_search) |
iq_track |
(i, q, fs_hz, signal, prns, **options) -> dict |
innhent og spor deretter hver PRN: Doppler, kodefase, låseindikatorer, C/N0 og prompt-korrelator per epoke |
iq_frontend |
(i, q, fs_hz, **options) -> dict |
mottakerens front-end-kjede (båndpass, notch, blanking, excision, AGC (automatic gain control), kvantiserer) over komplekse sampler |
iq_labfit |
(toml: str) -> dict |
tilpass modellen for tap av lås i sporingssløyfen til en tillitstidslinje for mottakeren (et iq-labfit-scenario) |
iq_loop_designs |
(toml) -> list[dict] |
parse en kshana.loop-design/1-fil (en sti eller TOML-tekst) til de løste utformingene, hver med sin name og hash; ValueError for en ugyldig fil |
iq_read_epochs |
(path) -> dict |
les en binær fil med sporingsepoker (kshana.track-epoch/1, slik kshana iq track --epochs skriver den): header og én dict per epoke i records |
iq_monitor |
(path, signal=None, prns=None, power=False, spectral=False, settings=None, ...) -> dict |
IQ-deteksjonsmonitorene over et opptak i ett strømmende gjennomløp (iq monitor): series, events, spectra og notes; leser en fil |
iq_test_conditions |
(conditions) -> dict |
valider en fil med labtestbetingelser (kshana.test-conditions/1, TOML eller JSON, en sti eller tekst) og returner den løst, med sin hash |
iq_campaign |
(campaign, out_dir, workers=0, resume=True, max_cells=None, dry_run=False) -> dict |
kjør en kampanje for avspilling i lab (kshana.campaign/1) inn i out_dir slik kshana iq campaign gjør; ferdige celler hoppes over; returnerer antall celler, feil og digest når hver celle er ferdig |
iq_campaign_report |
(out_dir) -> dict |
bygg en kampanjes resultatkort, HTML-rapport og sammendrag på nytt fra cellene: antall celler og rader, radene som feiler en terskel og digest |
Signaturer for GNSS IQ og mottakertillit#
De fullstendige signaturene, slik kshana.pyi oppgir dem (hvert nøkkelord etter de obligatoriske argumentene har en standardverdi; docstringene i stubben forklarer hvert enkelt). Pakk listene samples_i / samples_q og inndataene i / q inn med numpy.asarray(...) for tabeller.
def receiver_trust(toml: str) -> RunOutput: ...
def receiver_trust_replay(session_toml: str, nmea: str | bytes) -> dict: ...
def assess_vessel_log(session_toml: str, log: str | bytes) -> dict: ...
def jammertest_import(catalog_json: str, plans: list[str], log_start_utc: str, location: int | None = None,
local_offset_h: float = 2.0, year: int | None = None) -> dict: ...
def jammertest_score(session_toml: str, log: str | bytes, catalog_json: str, plans: list[str],
location: int | None = None, local_offset_h: float = 2.0,
log_start_utc: str | None = None, year: int | None = None,
recover_hold_s: float = 10.0, guard_s: float = 60.0) -> dict: ...
def evidence_create(session_toml: str, log: str | bytes, from_s: float, to_s: float,
title: str | None = None, created_utc: str | None = None,
seed_hex: str | None = None) -> dict: ...
def evidence_verify(files: dict[str, str | bytes], public_key: str | None = None,
full_log: str | bytes | None = None,
require_timestamp: bool = False) -> dict: ...
def interference_map(source: str, csv: str, dataset: str, cell_deg: float | None = None,
licence: str | None = None, licence_url: str | None = None,
attribution: str | None = None, land_geojson: str | None = None) -> list[dict]: ...
def route_exposure(route: str, maps: list[str], date_from: str | None = None,
date_to: str | None = None) -> str: ...
def export_sp3(toml: str) -> str: ...
def export_omm(toml: str) -> str: ...
def export_oem(toml: str) -> str: ...
def export_formats(toml: str) -> list[dict]: ...
def export_scenario(toml: str, format: str) -> dict: ...
def import_route(toml: str, geojson: str) -> str: ...
def animate_scenario(toml: str, format: str = "svg", fps: int | None = None,
duration_s: float | None = None, width: int | None = None) -> dict: ...
def list_examples(kind: str | None = None) -> dict: ...
def get_example(name: str) -> str: ...
def evidence_attach_timestamp(files: dict[str, str | bytes], token: str | bytes,
replace: bool = False) -> dict: ...
def evidence_keygen() -> dict: ...
def iq_sweep(i: list[float], q: list[float], fs_hz: float, signal: str, prns: list[int],
**options) -> dict: ...
def iq_info(path: str, hash: bool = False) -> dict: ...
def iq_inventory(directory: str, recursive: bool = False, hash: bool = False) -> list[dict]: ...
def bench_export(toml: str, epoch: str | None = None) -> dict: ...
def compliance_report(runs: list[dict[str, str]]) -> dict: ...
def compliance_mapping(sources: bool = False) -> str: ...
def standards_pack_list() -> dict[str, Any]: ...
def standards_pack_run(pack_id: str) -> dict[str, Any]: ...
def lunanet_afs_check_spec() -> dict[str, Any]: ...
def lunanet_afs_check_symbols(symbols: str, max_sp_errors: int = 0) -> dict[str, Any]: ...
def lunanet_afs_generate(frames: int = 1, toi0: int = 0) -> str: ...
def evidence_round_trip(scoring_toml: str, scenario_toml: str, conditions: str, log: str | bytes, from_s: float, to_s: float, title: Optional[str] = None, created_utc: Optional[str] = None, seed_hex: Optional[str] = None) -> dict[str, Any]: ...
def bench_score(truth_json: str, predictions_json: str, threshold: float | None = None) -> str: ...
def bench_leaderboard(results: list[str]) -> str: ...
def osnma_verify(data: bytes | str, format: str = "", start_gst: int | None = None,
merkle_root_hex: str = "", public_keys: list[str] | None = None,
reference_time: int | None = None, max_time_error: int | None = None) -> dict: ...
def sky_geometry(request: str | dict[str, Any]) -> dict[str, Any]: ...
def sky_monte_carlo(request: str | dict[str, Any], seed: int = 0, n: int = 1000) -> dict[str, Any]: ...
def skyline_presets() -> list[dict[str, Any]]: ...
def skyline_profile(skyline: str | dict[str, Any]) -> dict[str, Any]: ...
def skyplot_svg(request: str | dict[str, Any]) -> str: ...
def trust_telemetry(input: str, format: str, host: str = "", input_kind: str = "jsonl",
expose_position: bool = False, syslog_all: bool = False,
unix_nano: int = 0) -> str: ...
def nmea_training(toml: str, seed: int | None = None) -> dict[str, str]: ...
def iq_signals() -> list[str]: ...
def iq_scene(
fs_hz: float,
duration_s: float,
signal: str,
prns: list[int],
dopplers: Optional[list[float]] = ...,
cn0_dbhz: Optional[float] = ...,
center_hz: Optional[float] = ...,
if_hz: float = ...,
noise: bool = ...,
noise_figure_db: float = ...,
seed: int = ...,
data: bool = ...,
threads: int = ...,
iono_stec: Optional[float] = ...,
iono_vtec: Optional[float] = ...,
iono_klobuchar: bool = ...,
tropo: bool = ...,
tropo_doy: float = ...,
s4: Optional[float] = ...,
scint_tau0: float = ...,
sigma_phi: float = ...,
multipath_height: Optional[float] = ...,
multipath_ground: str = ...,
land_mobile: bool = ...,
nlos: bool = ...,
) -> dict[str, Any]: ...
def iq_scene_broadcast(
fs_hz: float,
window_s: float,
nav_text: str,
rx_lat: float,
rx_lon: float,
rx_alt: float,
prns: Optional[list[int]] = ...,
start_tow: float = ...,
cn0_dbhz: Optional[float] = ...,
center_hz: Optional[float] = ...,
if_hz: float = ...,
noise: bool = ...,
noise_figure_db: float = ...,
seed: int = ...,
mask_deg: float = ...,
threads: int = ...,
) -> dict[str, Any]: ...
def iq_acquire(
i: list[float],
q: list[float],
fs_hz: float,
signal: str,
prns: list[int],
if_hz: float = ...,
center_hz: Optional[float] = ...,
coherent: int = ...,
noncoherent: int = ...,
doppler_max: float = ...,
doppler_step: Optional[float] = ...,
pfa: float = ...,
) -> list[dict[str, Any]]: ...
def iq_acq_surface(
i: list[float],
q: list[float],
fs_hz: float,
signal: str,
prn: int,
if_hz: float = ...,
center_hz: Optional[float] = ...,
coherent: int = ...,
noncoherent: int = ...,
doppler_max: float = ...,
doppler_step: Optional[float] = ...,
pfa: float = ...,
) -> dict[str, Any]: ...
def iq_track(
i: list[float],
q: list[float],
fs_hz: float,
signal: str,
prns: list[int],
if_hz: float = ...,
center_hz: Optional[float] = ...,
pll_bw: Optional[float] = ...,
fll_bw: Optional[float] = ...,
dll_bw: Optional[float] = ...,
spacing: Optional[float] = ...,
coherent: Optional[int] = ...,
periods_per_bit: Optional[int] = ...,
acq_coherent: Optional[int] = ...,
acq_noncoherent: int = ...,
doppler_max: float = ...,
max_seconds: Optional[float] = ...,
) -> dict[str, Any]: ...
def iq_frontend(
i: list[float],
q: list[float],
fs_hz: float,
bandpass_lo: Optional[float] = ...,
bandpass_hi: Optional[float] = ...,
bandpass_transition: Optional[float] = ...,
bandpass_atten: float = ...,
notch: bool = ...,
notch_r: float = ...,
notch_mu: float = ...,
blank: Optional[float] = ...,
blank_hold: int = ...,
excise: bool = ...,
excise_fft: int = ...,
excise_pfa: float = ...,
agc: bool = ...,
agc_tau: float = ...,
bits: Optional[int] = ...,
quant_step: Optional[float] = ...,
no_agc: bool = ...,
) -> dict[str, Any]: ...
def iq_labfit(toml: str) -> dict[str, Any]: ...
def iq_loop_designs(toml: str) -> list[dict[str, Any]]: ...
def iq_read_epochs(path: str) -> dict[str, Any]: ...
def iq_monitor(path: str, signal: Optional[str] = ..., prns: Optional[list[int]] = ...,
power: bool = ..., spectral: bool = ..., settings: Optional[str] = ...,
**options) -> dict[str, Any]: ...
def iq_test_conditions(conditions: str) -> dict[str, Any]: ...
def iq_campaign(campaign: str, out_dir: str, workers: int = 0, resume: bool = True,
max_cells: Optional[int] = None, dry_run: bool = False) -> dict[str, Any]: ...
def iq_campaign_report(out_dir: str) -> dict[str, Any]: ...
En kampanje for avspilling i lab fra Python, så rapporten (kampanjefilen og opptakene er dine; en ferdig celle hoppes over ved neste kall; iq_read_epochs leser en fil med sporingsepoker som en kshana iq track --epochs-kjøring skrev):
import kshana
summary = kshana.iq_campaign("lab.campaign.toml", "campaign-out", workers=4)
report = kshana.iq_campaign_report("campaign-out")
print(report["digest"]) # None until every cell is done
iq_tracks acq_coherent bestemmer hvor mange kodeperioder overleveringsinnhentingen integrerer koherent. Fra 0.33.0 er standarden None, som betyr automatisk: omtrent 4 ms (4 perioder for en kode på 1 ms som GPS L1 C/A, 1 for en kode på 4 ms eller lengre), slik at kanalen starter nær nok til at frekvenssløyfen kan trekke seg inn; acq_coherent=1 beholder søket med én periode fra 0,32.
Typer#
kshana.pyi typer de lukkede vokabularene for kontrollprogrammer (mypy, pyright): ScenarioKind (hvert typenavn, en Literal), ErrorKind (de fire merkelappene error_kind returnerer), ProvenanceClass og TypedDict-ene KindMeta (det scenario_kinds() returnerer en liste av) og FieldUnit (en oppføring i et resultats units-blokk, som utvider basen med obligatoriske nøkler _FieldUnitBase). De finnes bare for typekontrollere og kan ikke importeres ved kjøring; tests/typed_api_sync.rs holder dem like motorens lister.
from typing import TYPE_CHECKING
import kshana
if TYPE_CHECKING:
from kshana import ScenarioKind
names: "list[ScenarioKind]" = [k["name"] for k in kshana.scenario_kinds()]
RunOutput#
| Medlem | Type | Merknader |
|---|---|---|
.json |
str |
fullt resultatdokument (JSON) |
.svg |
str |
frittstående diagram-SVG (Scalable Vector Graphics) |
.summary |
str |
enlinjes sammendrag for mennesker |
.csv |
str | None |
reproduserbarhetstabellen, for typene som gir en (se nedenfor) |
.data() |
dict |
resultatet parset til en Python-dict (se merknaden om formen nedenfor) |
.array(path) |
numpy.ndarray |
den numeriske listen ved path (med punktum, "points.0.coords", eller en JSON Pointer, "/points/0/coords"): 1-D for tall, 2-D for numeriske lister av lik lengde |
.columns(path) |
dict[str, numpy.ndarray] |
listen av poster ved path (en tidsserie), én tabell per felt som er et tall i hver post |
.series() |
dict[str, dict[str, numpy.ndarray]] |
hver liste av poster med et numerisk felt, nøklet på sti med punktum, hver som .columns |
.write_csv(path) |
int |
skriv den tabellen til path; returnerer antall bytes skrevet, eller 0 (og skriver ingenting) når typen ikke gir noen tabell |
Reproduserbarhetstabellen#
realtime-frame-eop, lunar-time-budget, lunar-jamming, telecom-timing og leo-navmsg publiserer alltid en tabell; moonlight-service-volume publiserer en når et eksportsted (export_site_lat_deg + export_site_lon_deg) er konfigurert. Alle andre typer returnerer csv = None. Teksten er de samme bytene som CLI-en (kommandolinjegrensesnittet) skriver som <scenario>.table.csv, slik at en gjennomgangsperson som gjenskaper en publisert tabell fra hjulet aldri må gå ned på kommandolinjen:
import kshana
out = kshana.run_typed(open("scenarios/realtime-frame-eop.toml").read())
if out.csv is not None:
print(out.write_csv("table.csv"), "bytes written")
Resultatets form#
Kvalitetsmålene og tidsseriene ligger per kjøringsside, ikke på toppnivå. For en klokkekjøring er dokumentet:
schema_version engine_version scenario_hash seed threshold_ns units figure_tiers
quantum → spec · series · fom · adev_curve · filter_health
classical → spec · series · fom · adev_curve · filter_health
slik at kvalitetsmålene er data["quantum"]["fom"], aldri data["figures_of_merit"]. Andre typer gir sine egne pakker; den fullstendige referansen per felt, med enheter og en kildehenvisning, er field-units-schema.json, og veiledningen for leseren er SCHEMA.md.
Merknader#
validate_tomlogerror_kindkjører scenarioet, slik at de avdekker parse-, konfigurasjons- og kjøretidsfeil. De kaster aldri unntak.run/run_typedkasterValueErrorved et ugyldig scenario.- Resultater kan gjenskapes: et scenario bærer sin
seedog motoren registrerer enscenario_hash, slik at samme inndata gir byte-identiske utdata på samme plattform (seREPRODUCIBILITY.md). .array,.columnsog.seriesreturnerer nøyaktignumpy.asarray(...)av de samme verdiene som.data()gir (samme dtype, bit-identisk;tests/python/test_numpy_runoutput.py). De importerer NumPy ved kall og kasterImportErroruten det; NumPy holdes utenfor pakkens krav ved kjøring.KeyErrorbetyr at stien mangler,ValueErrorat verdien der ikke er en numerisk tabell (eller ikke en liste av poster). Kjørbare notatbøker finnes inotebooks/.
Ikke i Python: langvarige prosesser#
kshana receiver-trust live (en strømprosess med en gate og en valgfri --listen-TCP-server) og telemetrieksportørene (Prometheus, OTLP, syslog; docs/TRUST-TELEMETRY.md) og strømming med kshana nmea-scenario --tcp/--udp er bare tilgjengelige på kommandolinjen: en binding returnerer når kallet returnerer og holder ikke en socket åpen. Python dekker batchformen av hver: receiver_trust for en logg, receiver_trust_replay for et strømutdrag (score og tilstander; gaten brukes ikke), nmea_training for den genererte teksten.