Files
nerfstudio/nerfstudio/utils/rich_utils.py
T
Brent Yi 814db32ec4 More typing fixes (#1941)
* Fix more types

* Fix tests

* Minor cleaning

* Address comments

* Resolve linting errors

* Re-ignore pymeshlab type

* Add extra assert / error message to mipnerf model
2023-05-17 07:17:40 -07:00

70 lines
2.3 KiB
Python

# Copyright 2022 the Regents of the University of California, Nerfstudio Team and contributors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Additional rich ui components"""
from contextlib import nullcontext
from typing import Optional
from rich.console import Console
from rich.progress import (
BarColumn,
Progress,
ProgressColumn,
Task,
TaskProgressColumn,
TextColumn,
TimeRemainingColumn,
)
from rich.text import Text
CONSOLE = Console(width=120)
class ItersPerSecColumn(ProgressColumn):
"""Renders the iterations per second for a progress bar."""
def __init__(self, suffix="it/s") -> None:
super().__init__()
self.suffix = suffix
def render(self, task: Task) -> Text:
"""Show data transfer speed."""
speed = task.finished_speed or task.speed
if speed is None:
return Text("?", style="progress.data.speed")
return Text(f"{speed:.2f} {self.suffix}", style="progress.data.speed")
def status(msg: str, spinner: str = "bouncingBall", verbose: bool = False):
"""A context manager that does nothing is verbose is True. Otherwise it hides logs under a message.
Args:
msg: The message to log.
spinner: The spinner to use.
verbose: If True, print all logs, else hide them.
"""
if verbose:
return nullcontext()
return CONSOLE.status(msg, spinner=spinner)
def get_progress(description: str, suffix: Optional[str] = None):
"""Helper function to return a rich Progress object."""
progress_list = [TextColumn(description), BarColumn(), TaskProgressColumn(show_speed=True)]
progress_list += [ItersPerSecColumn(suffix=suffix)] if suffix else []
progress_list += [TimeRemainingColumn(elapsed_when_finished=True, compact=True)]
progress = Progress(*progress_list)
return progress