Source code for hamil_clever_sim.components.timing_data

from time import strftime

from rich.text import Text
from textual.app import ComposeResult
from textual.containers import Horizontal
from textual.reactive import Reactive, reactive
from textual.widgets import Label, Static

from hamil_clever_sim.hamil_runner import (
    SimulationTimingData,
)

# TIMING_TEMPLATE = Template(
#     """__Started at:__ ${start}
#
# __Build time:__ ${build_time}s
#
# __Simu. time:__ ${simulation_time}s
#
# __Total time:__ ${total}s
# """
# )


[docs] class TimingInformation(Static): data: Reactive[SimulationTimingData | None] = reactive( None, layout=True, always_update=True ) start = reactive("...", layout=True) build_time = reactive("...", layout=True) simulation_time = reactive("...", layout=True) total_time = reactive("...", layout=True) def watch_data(self, update: SimulationTimingData): print(self.data) if update is None: return def compute_build_time(self): if self.data is None or self.data.finish_build is None: return "..." elapsed_ns = self.data.finish_build - self.data.start elapsed = elapsed_ns / 1e9 return str(elapsed) + "s" def compute_simulation_time(self): if self.data is None: return "..." deps = [self.data.finish_build, self.data.end_sim] missing = any([dep is None for dep in deps]) if missing: return "..." assert self.data.finish_build is not None assert self.data.end_sim is not None elapsed_ns = self.data.end_sim - self.data.finish_build elapsed = elapsed_ns / 1e9 return str(elapsed) + "s" def compute_total_time(self): if self.data is None or self.data.end_sim is None: return "..." elapsed_ns = self.data.end_sim - self.data.start elapsed = elapsed_ns / 1e9 return str(elapsed) + "s" def compute_start(self): if self.data is None: return "..." return strftime("%H:%M:%S - %d/%m", self.data.start_as_timestamp) # def compute_template(self) -> str: # return TIMING_TEMPLATE.substitute( # start=self.start, # build_time=self.build_time, # simulation_time=self.simulation_time, # total=self.total_time, # ) def watch_start(self, value: str): self.query_one(".timing-data-start", Label).update(Text(value)) def watch_build_time(self, value: str): self.query_one(".timing-data-build", Label).update(Text(value)) def watch_simulation_time(self, value: str): self.query_one(".timing-data-simulation", Label).update(Text(value)) def watch_total_time(self, value: str): self.query_one(".timing-data-total", Label).update(Text(value)) def compose(self) -> ComposeResult: with Horizontal(classes="timing-data-elem"): yield Label("Started at:", classes="timing-data-label") yield Label("...", classes="timing-data-start") with Horizontal(classes="timing-data-elem"): yield Label("Build time:", classes="timing-data-label") yield Label("...", classes="timing-data-build") with Horizontal(classes="timing-data-elem"): yield Label("Simu. time:", classes="timing-data-label") yield Label("...", classes="timing-data-simulation") with Horizontal(classes="timing-data-elem"): yield Label("Total time:", classes="timing-data-label") yield Label("...", classes="timing-data-total")