import os
import time
from pathlib import Path
import numpy as np
import brahe
from benchmarks.comparative.results import TaskResult
def time_iterations(func, iterations: int):
times: list[float] = []
first_results = None
for i in range(iterations):
start = time.perf_counter()
results = func()
elapsed = time.perf_counter() - start
times.append(elapsed)
if i == 0:
first_results = results
return times, first_results
def _find_orekit_eop_file() -> str | None:
orekit_data = os.environ.get(
"OREKIT_DATA", str(Path.home() / ".orekit" / "orekit-data")
)
eop_path = (
Path(orekit_data)
/ "Earth-Orientation-Parameters"
/ "IAU-2000"
/ "finals2000A.all"
)
if eop_path.exists():
return str(eop_path)
return None
def ensure_eop() -> None:
if not brahe.get_global_eop_initialization():
eop_path = _find_orekit_eop_file()
if eop_path:
provider = brahe.FileEOPProvider.from_file(eop_path, True, "Hold")
brahe.set_global_eop_provider(provider)
else:
brahe.initialize_eop()
def jd_to_utc_epoch(jd: float) -> "brahe.Epoch":
return brahe.Epoch.from_jd(jd, brahe.TimeSystem.UTC)
def jd_to_spice_et_string(jd: float) -> str:
epc = jd_to_utc_epoch(jd)
iso = epc.isostring_with_decimals(3) date, rest = iso.split("T")
t = rest.rstrip("Z")
return f"{date} {t} UTC"
def j2000_to_gcrf(r_m, v_mps) -> list[float]:
ensure_eop()
state = np.array([*r_m, *v_mps], dtype=float)
gcrf = brahe.state_eme2000_to_gcrf(state)
return list(map(float, gcrf))
def build_task_result(
task_name: str,
iterations: int,
times_seconds: list,
results: list,
extra_metadata: dict | None = None,
) -> TaskResult:
import Basilisk
metadata = {
"library": "basilisk",
"language": "basilisk",
"version": getattr(Basilisk, "__version__", "unknown"),
}
if extra_metadata:
metadata.update(extra_metadata)
return TaskResult(
task_name=task_name,
language="basilisk",
library="basilisk",
iterations=iterations,
times_seconds=times_seconds,
results=results,
metadata=metadata,
)