import os
import sys
import time
from pathlib import Path
import numpy as np
import brahe
from benchmarks.comparative.results import TaskResult
_GMAT_INITIALIZED = False
def _ensure_gmat() -> None:
global _GMAT_INITIALIZED
if _GMAT_INITIALIZED:
return
gmat_root = os.environ.get("GMAT_ROOT_PATH")
if not gmat_root:
raise ImportError("GMAT_ROOT_PATH not set")
root = Path(gmat_root)
py_tag = f"_py{sys.version_info.major}{sys.version_info.minor}"
so_path = root / "bin" / "gmatpy" / py_tag / "_gmat_py.so"
if not so_path.exists():
raise ImportError(
f"gmatpy missing binary for Python {py_tag} at {so_path}"
)
startup = root / "bin" / "api_startup_file.txt"
if not startup.exists():
raise ImportError(
f"api_startup_file.txt missing at {startup} — "
f"run: just bench-compare-setup"
)
bin_dir = str(root / "bin")
if bin_dir not in sys.path:
sys.path.insert(1, bin_dir)
import gmatpy as gmat
gmat.Setup(str(startup))
_GMAT_INITIALIZED = True
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 gmat_clear() -> None:
import gmatpy as gmat
gmat.Clear()
def km_to_m_state(state_km) -> list[float]:
return [float(x) * 1000.0 for x in state_km]
def m_to_km_state(state_m) -> list[float]:
return [float(x) / 1000.0 for x in state_m]
def mu_si_to_gmat(mu_si: float) -> float:
return mu_si * 1.0e-9
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 mj2000_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:
metadata = {
"library": "gmat",
"language": "gmat",
"version": _detect_gmat_version(),
}
if extra_metadata:
metadata.update(extra_metadata)
return TaskResult(
task_name=task_name,
language="gmat",
library="gmat",
iterations=iterations,
times_seconds=times_seconds,
results=results,
metadata=metadata,
)
def _detect_gmat_version() -> str:
root = os.environ.get("GMAT_ROOT_PATH", "")
name = Path(root).name return name or "unknown"
def quat_brahe_to_gmat(q_brahe) -> list[float]:
return [float(q_brahe[1]), float(q_brahe[2]), float(q_brahe[3]), float(q_brahe[0])]
def quat_gmat_to_brahe(q_gmat) -> list[float]:
return [float(q_gmat[3]), float(q_gmat[0]), float(q_gmat[1]), float(q_gmat[2])]