Python API
Kshana tarjoaa ensiluokkaisen Python-ohjelmointirajapinnan (API), joka on rakennettu työkaluilla PyO3 ja maturin. Sen wheel-paketit (abi3) rakennetaan vakaata Pythonin binäärirajapintaa (ABI) vasten, joten yksi wheel-paketti alustaa kohti toimii kaikilla CPython-versioilla ≥ 3,9; paketit kattavat Linuxin, macOS:n ja Windowsin, kukin x86-64- ja 64-bittiselle ARM-arkkitehtuurille (ks. WHEEL_TAGS.md). Mukana toimitettu tyyppiprofiili (kshana.pyi + py.typed) antaa editoreille sekä työkaluille mypy ja pyright täydet tyyppitiedot.
pip install kshana # from the Python Package Index, PyPI (release wheels)
# or, from a checkout:
pip install maturin && maturin develop --features python
Pikaopas#
Aja nämä katkelmat repositorion tarkistetun kopion juuresta: ne lukevat skenaariotiedostoja hakemistosta scenarios/. NumPy-rivi tarvitsee komennon 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
Pinta#
| Symboli | Allekirjoitus | Palauttaa |
|---|---|---|
run_typed |
(toml: str) -> RunOutput |
tyypitetty tulos (.json, .svg, .summary, .csv, .data(), .array(), .columns(), .series(), .write_csv()) |
run |
(toml: str) -> str |
tulosasiakirja JSON-merkkijonona (JavaScript Object Notation) |
run_full |
(toml: str) -> tuple[str, str, str] |
(json, svg, summary) |
scenario_kinds |
() -> list[dict] |
käytettävissä olevat skenaariotyypit + metatiedot (jäsennetty) |
list_kinds |
() -> str |
samat metatiedot YHTENÄ JSON-taulukkomerkkijonona, ei listana (säilytetty nykyisiä kutsujia varten; käytä jäsennetylle listalle kutsua scenario_kinds) |
validate_toml |
(toml: str) -> list[str] |
virheilmoitukset (tyhjä, jos kelvollinen) |
error_kind |
(toml: str) -> str | None |
virheluokan tunniste (invalid_input, non_convergence, unsupported tai io_error) tai None onnistuessa |
version / __version__ |
() -> str / str |
moottorin versio |
receiver_trust |
(toml: str) -> RunOutput |
arvioi todellinen vastaanottimen loki, jota kuvaa skenaario receiver-trust: tulosasiakirja, epookkikohtainen luottamus-CSV, kaavio ja yhteenveto; taulu [platform] kind = "vessel" lisää merellisen käytön valvonnat ja 0–100 luottamuspistemäärän syineen (ohjeellinen) |
receiver_trust_replay |
(session_toml, nmea) -> dict |
rajattu NMEA-katkelma pisteytettynä samalla tavalla kuin live-tila pisteyttää: epookkikohtainen tila, 0–100 pistemäärä ja syyt sekä yhteenveto (ei socketia, ei porttia; ohjeellinen) |
assess_vessel_log |
(session_toml, log) -> dict |
aluksen NMEA-loki eräajona: pisteytysmalli ja jokaisen epookin pistemäärä vähennyksineen (ohjeellinen) |
jammertest_import |
(catalog_json, plans, log_start_utc, location=None, local_offset_h=2.0, year=None) -> dict |
julkaistu Jammertest-katalogi ja -suunnitelma ajastettuina totuustapahtumina (events_toml, events); suunnitellut ajanjaksot, ei tallennettuja lähetysaikoja |
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 |
tuo aikataulua vasten pisteytetty vastaanottimen loki: testikohtainen viive, havaitsematta jääneet, palautumisaika, väärät hälytykset (MODELLED; allekirjoitettu paketti vaatii komentorivin) |
evidence_create |
(session_toml, log, from_s, to_s, title=None, created_utc=None, seed_hex=None) -> dict |
allekirjoitettu todistepaketti lokin jaksolle muistissa: files, public_key, seed_hex (pidä yksityisenä); tekninen tallenne, ei oikeudellinen lausunto |
evidence_verify |
(files, public_key=None, full_log=None, require_timestamp=False) -> dict |
varmenna paketti: tiivisteet, ketju, allekirjoitus, valinnaisesti luotettu allekirjoittaja, koko loki ja aikaleima; verdict on verified, intact-signer-not-pinned (julkista avainta ei annettu: ehjä, allekirjoittajaa ei vahvistettu) tai failed |
export_sp3, export_omm, export_oem |
(toml) -> str |
komentorivin artefaktit (--export-sp3/-omm/-oem) tekstinä |
export_formats |
(toml) -> list[dict] |
mitkä yhteentoimivuusmuodot sopivat skenaarioon, ajamatta sitä |
export_scenario |
(toml, format) -> dict |
czml, kml, geojson, stk tai sigmf muistissa: {format, spec_url, files}, kukin tiedosto {suffix, bytes, sha256, encoding, content} (tekstinä utf-8 tai base64) |
import_route |
(toml, geojson) -> str |
GeoJSON-reitti kirjoitettuna reittipistepolkuskenaarioon (--import-route) |
animate_scenario |
(toml, format="svg", fps=None, duration_s=None, width=None) -> dict |
ajon aikasarja animoituna SVG:nä, HTML-soittimena tai enintään 120 SVG-kuvana: {summary, files} |
list_examples, get_example |
(kind=None) -> dict, (name) -> str |
mukana toimitetut vertailuskenaariot ja niiden TOML |
evidence_attach_timestamp |
(files, token, replace=False) -> dict |
sido RFC 3161 -token (tavuina tai base64) pakettiin muistissa: {files, notes}; paketin on yhä varmennuttava; viranomaisen allekirjoitusta ei tarkisteta |
evidence_keygen |
() -> dict |
uusi allekirjoitusavain muistissa: seed_hex (YKSITYINEN), public_key, fingerprint, warning; vain Python |
iq_sweep |
(i, q, fs_hz, signal, prns, ..., pll_bws=None, dll_bws=None, spacings=None, coherents=None, design=None) -> dict |
toista yksi tallenne eri silmukkamallien yli (iq sweep): mallia ja PRN:ää kohti vakaan tilan jitter, lukitusosuudet ja C/N0; yksi hankinta PRN:ää kohti, jokainen kanava samoilla näytteillä |
iq_info, iq_inventory |
(path, hash=False) -> dict, (directory, recursive=False, hash=False) -> list |
kuvaa yksi tallenne tai kaikki kansion tallenteet (lukee tiedostoja; hash lukee ne kokonaan) |
bench_export |
(toml, epoch=None) -> dict |
skenaarion ajoneuvon liike ja tapahtumat laboratorion GNSS-simulaattoria varten, muistissa: {files: {suffix: text}, notes, notice}; tyypit gnss-ins, jamming, gnss-sim; signaalia ei kirjoiteta, säilytä notice tiedostojen mukana |
compliance_report |
(runs) -> dict |
julkisen viitekehyksen vastaavuus täytettynä tulostesteistä: runs on lista sanakirjoja muotoa {label, result, scenario?} (teksti, enintään 64); palauttaa {report, markdown}; kunkin rivin status kertoo, että ajot tukevat todisteita (supports evidence for) sen ominaisuuksille, ei sitä, että viitekehys on täytetty; liitä report["statement"] mukaan kaikkeen esitykseen |
compliance_mapping |
(sources=False) -> str |
staattiset vastaavuustaulukot (tai lähdeasiakirjat) Markdownina, lausuma ensimmäisenä |
standards_pack_list |
() -> dict |
standardipaketit (tunniste, otsikko, viitekehys, testimäärät) ja huomautus; paketti mittaa mallinnettuja skenaarioita ennen ajoa asetettuja kynnyksiä vasten |
standards_pack_run |
(pack_id) -> dict |
yhden paketin ajo: jokainen testi MET, NOT MET tai NEEDS INPUT mitattuine ja odotettuine arvoineen sekä raportti Markdownina kohdassa markdown; nostaa virheen ValueError tuntemattomalle tunnisteelle |
lunanet_afs_check_spec |
() -> dict |
LunaNet AFS -toteutus tarkistettuna LSIS-AFS V1.0:n painettuja taulukoita ja läpikäytyjä esimerkkejä vasten (kynnykset B1–B10; B4 raportoi yhden kiinnitetyn ohituksen) |
lunanet_afs_check_symbols |
(symbols, max_sp_errors=0) -> dict |
AFS-symbolivirta (tekstinä 0 ja 1) tarkistettuna synkronointikuvion, SB1-dekoodauksen, FID:n sekä TOI:n jatkuvuuden ja välien osalta; alikehysten 2–4 LDPC:tä ja CRC-24Q:ta ei varmenneta |
lunanet_afs_generate |
(frames=1, toi0=0) -> str |
testisymbolivirta paikkamerkkialikehyksillä (ei aaltomuoto) |
evidence_round_trip |
(scoring_toml, scenario_toml, conditions, log, from_s, to_s, title=None, created_utc=None, seed_hex=None) -> dict |
allekirjoitettu laboratorion edestakaisen ketjun paketti, joka linkittää tiivisteillä skenaarion, testiolosuhteet (docs/spec/TEST-CONDITIONS.md), vastaanottimen lokin ja pistemäärän; muodossa evidence_create |
bench_score |
(truth_json, predictions_json, threshold=None) -> str |
kshana-bench-tulostiedosto (JSON-teksti) totuustiedostosta ja ennustetiedostosta; MODELLED |
bench_leaderboard |
(results: list[str]) -> str |
kshana-bench-tulostiedostot esitettynä staattisena tulostaulusivuna (HTML) |
osnma_verify |
(data, format="", start_gst=None, merkle_root_hex="", public_keys=None, reference_time=None, max_time_error=None) -> dict |
Galileo OSNMA -todennus I/NAV-sivuille tai UBX-virralle muistissa: sanakirja, jonka kshana osnma verify --json tulostaa, ja ohjeellinen huomautus kentässä advisory; vain ohjeellinen, ei navigoinnin eheyspalvelu |
sky_geometry |
(request) -> dict |
satelliitit, jotka paikka näkee atsimuutista riippuvan horisonttiprofiilin alla: satelliittikohtaisesti visible / masked, GDOP, PDOP, HDOP, VDOP, TDOP, itä–pohjoinen–ylös-kofaktori ja kovarianssi sekä vaakavirheellipsit; request on JSON- tai TOML-teksti tai sanakirja (site, time_s, systems, tle, satellites, mask_deg, skyline, clock, sigma_uere_m, confidence); näkyvyyspäätös ja ellipsi tarkistetaan riippumattomia kirjastoja vasten, loput on MODELLED, ja tulos kantaa ohjeellisen huomautuksen (sky_source ja sky_statement kertovat, onko taivas edustava vai elementtijoukoista) |
sky_monte_carlo |
(request, seed=0, n=1000) -> dict |
n (1–5000) siemenluvulla tuotettua pienimmän neliösumman virhettä joukon request näkyvillä satelliiteilla, niiden empiirinen kovarianssi, RMS ja 95 prosentin ellipsin sisään osuvien osuus |
skyline_presets |
() -> list[dict] |
horisonttiprofiilien esiasetukset (city-street, harbour-approach, fjord, container-terminal) REPRESENTATIVE-merkintöineen, alkuperätietoineen ja leikkauksineen jokaiselle atsimuuttiasteelle; edustavia geometrioita, ei mittauksia |
skyline_profile |
(skyline) -> dict |
horisonttiprofiilin osio (taulukko, katukanjoni, sektorit, maasto) supistettuna 360-alkioiseksi normalisoiduksi taulukoksi, jota moottori käyttää |
skyplot_svg |
(request) -> str |
taivaskartta kohteesta request staattisena SVG-tekstinä |
trust_telemetry |
(input, format, host="", input_kind="jsonl", expose_position=False, syslog_all=False, unix_nano=0) -> str |
luottamusvirta (jsonl) tai tulos receiver-trust Prometheus-tekstinä, CEF- tai LEEF-syslog-riveinä tai OTLP-JSON-sisältönä, enkoodereilla kshana trust-telemetry; mitään ei lähetetä eikä kelloa lueta (syslog-riveillä ei ole aikaleimaa) |
interference_map |
(source, csv, dataset, cell_deg=None, licence=None, licence_url=None, attribution=None, land_geojson=None) -> list[dict] |
GNSS-häiriökartta ADS-B- tai AIS-CSV-tekstistä: yksi sanakirja UTC-päivää kohti, GeoJSON kshana-interference-map/v1 (vain koostettu; heikentynyt ruutu ei nimeä häiriötä syyksi) |
interference_emitter_regions |
(source, csv, dataset, licence=None, licence_url=None, attribution=None, land_geojson=None) -> dict |
arvioidut lähetinalueet ADS-B- tai AIS-CSV-tekstistä: {stem, geojson, summary, csv, svg, sessions_published, sessions_withheld}, kukin merkitty MODELLED; alueet ilmoitetulla luottamustasolla painopisteen ja epävarmuusellipsin kanssa, ei koskaan pelkkä piste; vain koosteena, ja alue ei ole kenenkään sijainti eikä syyn määritys |
route_exposure |
(route, maps, date_from=None, date_to=None) -> str |
reitin osuus näiden karttojen heikentyneiden ruutujen läpi JSON-tekstinä (ei ennuste; havaitsemattomat ruudut eivät ole todiste vapaasta reitistä) |
nmea_training |
(toml, seed=None) -> dict |
synteettinen siltaympäristön NMEA miehistön koulutukseen sekä ohjaajan loki (nmea, log_json, log_text); vain tekstiä, ei koskaan aluksen live-navigointijärjestelmiin |
iq_signals |
() -> list[str] |
GNSS-IQ-signaalien nimet, jotka iq_scene, iq_acquire ja iq_track hyväksyvät (gps-l1ca, galileo-e1b, glonass-l1of, ...) |
iq_scene |
(fs_hz, duration_s, signal, prns, **options) -> dict |
usean satelliitin GNSS-IQ-skene muistissa: samples_i / samples_q ja epookkikohtainen truth |
iq_scene_broadcast |
(fs_hz, window_s, nav_text, rx_lat, rx_lon, rx_alt, **options) -> dict |
sama, kun jokainen GPS-satelliitti on lähetetyn efemeridin geometriassa RINEX-navigointiviestistä (Receiver Independent Exchange Format) |
iq_acquire |
(i, q, fs_hz, signal, prns, **options) -> list[dict] |
jokaisen PRN:n (pseudosatunnaiskoodi) FFT-hankinta (nopea Fourier-muunnos): Doppler, koodivaihe, tunnusluku, kynnys |
iq_acq_surface |
(i, q, fs_hz, signal, prn, **options) -> dict |
yhden PRN:n koko hankintapinta (kshana.acq-surface/1): korrelaatioteho rows[doppler][lag], huippu ja kaksi hienon Dopplerin tarkennusta (parabolic, fine_search) |
iq_track |
(i, q, fs_hz, signal, prns, **options) -> dict |
hanki ja seuraa sitten jokaista PRN:ää: epookkikohtainen Doppler, koodivaihe, lukitusindikaattorit, C/N0, prompt-korrelaattori |
iq_frontend |
(i, q, fs_hz, **options) -> dict |
vastaanottimen etupään ketju (kaistanpäästö, ura, tyhjennys, poisto, AGC (automaattinen vahvistuksensäätö), kvantisoija) kompleksinäytteille |
iq_labfit |
(toml: str) -> dict |
sovita seurantasilmukan lukituksen menetyksen malli vastaanottimen luottamusaikajanaan (skenaario iq-labfit) |
iq_loop_designs |
(toml) -> list[dict] |
jäsennä tiedosto kshana.loop-design/1 (polku tai TOML-teksti) ratkaistuiksi malleikseen, kullakin name ja hash; ValueError virheellisestä tiedostosta |
iq_read_epochs |
(path) -> dict |
lue binäärinen seurantaepookkitiedosto (kshana.track-epoch/1, sellaisena kuin kshana iq track --epochs sen kirjoittaa): header ja yksi sanakirja epookkia kohti kohdassa records |
iq_monitor |
(path, signal=None, prns=None, power=False, spectral=False, settings=None, ...) -> dict |
IQ-havaitsemisvalvonnat tallenteen yli yhdellä suoratoistokierroksella (iq monitor): series, events, spectra ja notes; lukee tiedoston |
iq_test_conditions |
(conditions) -> dict |
validoi laboratorion testiolosuhdetiedosto (kshana.test-conditions/1, TOML tai JSON, polku tai teksti) ja palauta se ratkaistuna sekä sen hash |
iq_campaign |
(campaign, out_dir, workers=0, resume=True, max_cells=None, dry_run=False) -> dict |
aja laboratorioon toistettava kampanja (kshana.campaign/1) hakemistoon out_dir kuten kshana iq campaign tekee; valmiit solut ohitetaan; palauttaa solumäärät, virheet ja digest, kun jokainen solu on valmis |
iq_campaign_report |
(out_dir) -> dict |
rakenna kampanjan tulostaulut, HTML-raportti ja tiiviste uudelleen sen soluista: solu- ja rivimäärät, kynnyksen alittavat rivit ja digest |
GNSS-IQ:n ja vastaanottimen luottamuksen allekirjoitukset#
Täydet allekirjoitukset sellaisina kuin kshana.pyi ne esittää (jokaisella pakollisten argumenttien jälkeisellä avainsanalla on oletus; profiilin docstring-kommentit kertovat kunkin merkityksen). Kääri listat samples_i / samples_q ja syötteet i / q taulukoiksi kutsulla numpy.asarray(...).
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]: ...
Laboratorioon toistettava kampanja Pythonista ja sen raportti (kampanjatiedosto ja sen tallenteet ovat sinun; valmis solu ohitetaan seuraavalla kutsulla; iq_read_epochs lukee seurantaepookkitiedoston, jonka ajo kshana iq track --epochs kirjoitti):
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
Kutsussa iq_track asetus acq_coherent määrää, kuinka monta koodijaksoa luovutushankinta integroi koherentisti. Versiosta 0.33.0 alkaen oletus on None, mikä tarkoittaa automaattista: noin 4 ms (4 jaksoa koodille, jonka pituus on 1 ms, kuten GPS L1 C/A, ja 1 jakso koodille, jonka pituus on vähintään 4 ms), jolloin kanava aloittaa riittävän läheltä, jotta taajuussilmukka voi vetäytyä sisään; asetus acq_coherent=1 säilyttää version 0,32 yhden jakson haun.
Tyypit#
Tiedosto kshana.pyi tyypittää suljetut sanastot tarkistimille (mypy, pyright): ScenarioKind (jokainen tyypin nimi, Literal), ErrorKind (neljä tunnistetta, jotka error_kind palauttaa), ProvenanceClass sekä sanakirjatyypit (TypedDict) KindMeta (lista näistä on kutsun scenario_kinds() paluuarvo) ja FieldUnit (tuloksen lohkon units alkio, joka laajentaa pakollisten avainten kantatyyppiä _FieldUnitBase). Ne ovat olemassa vain tyyppitarkistimille eikä niitä voi tuoda ajonaikaisesti; tests/typed_api_sync.rs pitää ne yhtäläisinä moottorin listojen kanssa.
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#
| Jäsen | Tyyppi | Huomautukset |
|---|---|---|
.json |
str |
täysi tulosasiakirja (JSON) |
.svg |
str |
erillinen kaavio-SVG (Scalable Vector Graphics) |
.summary |
str |
yksirivinen ihmisluettava yhteenveto |
.csv |
str | None |
toistettavuustaulukko niille tyypeille, jotka sellaisen tuottavat (ks. alla) |
.data() |
dict |
tulos jäsennettynä Python-sanakirjaksi (ks. rakennetta koskeva huomautus alla) |
.array(path) |
numpy.ndarray |
numeerinen lista kohdassa path (pistenotaatio, "points.0.coords", tai JSON Pointer, "/points/0/coords"): 1-ulotteinen luvuille, 2-ulotteinen yhtä pitkille numeerisille listoille |
.columns(path) |
dict[str, numpy.ndarray] |
tietueiden lista kohdassa path (aikasarja), yksi taulukko kutakin kenttää kohti, joka on luku jokaisessa tietueessa |
.series() |
dict[str, dict[str, numpy.ndarray]] |
jokainen tietueiden lista, jolla on numeerinen kenttä, pistepolulla avainnettuna, kukin muodossa .columns |
.write_csv(path) |
int |
kirjoita tämä taulukko kohteeseen path; palauttaa kirjoitettujen tavujen määrän tai 0 (eikä kirjoita mitään), kun tyyppi ei tuota taulukkoa |
Toistettavuustaulukko#
realtime-frame-eop, lunar-time-budget, lunar-jamming, telecom-timing ja leo-navmsg julkaisevat aina taulukon; moonlight-service-volume julkaisee sellaisen, kun vientipaikka (export_site_lat_deg + export_site_lon_deg) on määritetty. Jokainen muu tyyppi palauttaa csv = None. Teksti on samat tavut, jotka komentorivi (CLI) kirjoittaa tiedostoksi <scenario>.table.csv, joten julkaistun taulukon wheel-paketista toistava tarkastaja ei koskaan joudu turvautumaan komentoriviin:
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")
Tuloksen rakenne#
Laatumittarit ja aikasarja sijaitsevat ajon puolen mukaan, eivät ylätasolla. Kelloajon asiakirja on:
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
joten laatumittarit ovat data["quantum"]["fom"], eivät koskaan data["figures_of_merit"]. Muut tyypit tuottavat omat pakettinsa; täydellinen kenttäkohtainen viite yksiköineen ja lähdeviitteineen on field-units-schema.json, ja lukijan opas on SCHEMA.md.
Huomautukset#
validate_tomljaerror_kindsuorittavat skenaarion, joten ne tuovat esiin jäsennys-, konfiguraatio- ja ajonaikaiset virheet. Ne eivät koskaan nosta poikkeusta.run/run_typednostavat virheenValueErrorvirheellisestä skenaariosta.- Tulokset ovat toistettavia: skenaario kantaa mukanaan kentän
seed, ja moottori tallentaa kentänscenario_hash, joten sama syöte tuottaa tavu tavulta saman tulosteen samalla alustalla (ks.REPRODUCIBILITY.md). .array,.columnsja.seriespalauttavat täsmälleen samannumpy.asarray(...)samoista arvoista kuin.data()(sama dtype, bitti bitiltä sama;tests/python/test_numpy_runoutput.py). Ne tuovat NumPyn kutsuttaessa ja nostavat virheenImportErrorilman sitä; NumPy pysyy paketin ajonaikaisten vaatimusten ulkopuolella.KeyErrortarkoittaa, että polku puuttuu, jaValueError, että siellä oleva arvo ei ole numeerinen taulukko (tai ei lista tietueita). Ajettavat muistikirjat ovat hakemistossanotebooks/.
Ei Pythonissa: pitkäkestoiset prosessit#
kshana receiver-trust live (virtaprosessi portilla ja valinnaisella TCP-palvelimella --listen) sekä telemetrian viejät (Prometheus, OTLP, syslog; docs/TRUST-TELEMETRY.md) ja suoratoisto (kshana nmea-scenario --tcp/--udp) ovat vain komentorivillä: sidos palaa kutsun palatessa eikä pidä socketia auki. Python kattaa kunkin eräversion: receiver_trust lokille, receiver_trust_replay virtakatkelmalle (pistemäärät ja tilat; porttia ei sovelleta) ja nmea_training generoidulle tekstille.