Source code for itasc.tracking_ultrack.solve
"""Thin wrapper around ultrack.core.solve.processing.solve."""
from __future__ import annotations
from pathlib import Path
from collections.abc import Generator
from itasc.tracking_ultrack.config import TrackingConfig
from itasc.tracking_ultrack.ingest import _build_ultrack_config
[docs]
def database_has_annotations(working_dir: str | Path) -> bool:
"""Return whether ``data.db`` contains REAL or FAKE node annotations."""
import sqlalchemy as sqla
from sqlalchemy.orm import Session
from ultrack.core.database import NodeDB, VarAnnotation
db_path = Path(working_dir) / "data.db"
if not db_path.exists():
return False
engine = sqla.create_engine(f"sqlite:///{db_path}")
try:
with Session(engine) as session:
return bool(
session.query(NodeDB.id)
.where(NodeDB.node_annot.in_([VarAnnotation.REAL, VarAnnotation.FAKE]))
.limit(1)
.first()
)
finally:
engine.dispose()
[docs]
def run_solve(
working_dir: str | Path,
cfg: TrackingConfig,
*,
overwrite: bool = True,
use_annotations: bool | None = True,
) -> Generator[tuple[int, int, str], None, None]:
"""Run the ILP solver, yielding (step, total, label) progress tuples."""
from ultrack.core.solve.processing import solve
total = 2
wd = Path(working_dir)
ultrack_cfg = _build_ultrack_config(cfg, wd)
if use_annotations is None:
use_annotations = True
yield (0, total, "Running ILP solver…")
solve(ultrack_cfg, overwrite=overwrite, use_annotations=use_annotations)
yield (total, total, "Solve done.")