Source code for vivyd.core.taichi

from ._taichi_fallback import TaichiFallback

from typing import Protocol, runtime_checkable

try:
    import taichi as ti
except ImportError:
    _IS_TAICHI_AVAILABLE = False
    ti_or_fallback = TaichiFallback()
else:
    _IS_TAICHI_AVAILABLE = True
    ti_or_fallback = ti

ti_or_fallback.__doc__ = ("""
    If Taichi is available, this is the Taichi module. Otherwise, this is a
    fallback object that raises errors when Taichi features are accessed.
""")


_USE_TAICHI = False


[docs] def use_taichi(use_taichi: bool=True, **ti_params): """ Enable or disable Taichi acceleration for compatible objects. Parameters ---------- use_taichi : bool, optional Whether to enable Taichi acceleration. Default is `True`. **ti_params Additional parameters to pass to `ti.init()` when enabling Taichi. Most commonly used parameters include: - `arch`: The Taichi backend to use (e.g., `ti.cpu`, `ti.gpu`, etc.). Default is `ti.cpu`. - `cpu_max_num_threads`: The maximum number of CPU threads to use when `arch` is `ti.cpu`. The default parameters are also modified to use double precision floating point (`ti.f64`) and to disable fast math optimizations, which can improve numerical accuracy at the cost of performance. See `<https://docs.taichi-lang.org/docs/hello_world#initialize-taichi>`_ for more information. """ global _USE_TAICHI if use_taichi: if _IS_TAICHI_AVAILABLE: _USE_TAICHI = True if "arch" not in ti_params: ti_params["arch"] = ti_or_fallback.cpu if "cpu_max_num_threads" not in ti_params: ti_params["cpu_max_num_threads"] = 1 if "default_fp" not in ti_params: ti_params["default_fp"] = ti_or_fallback.f64 if "fast_math" not in ti_params: ti_params["fast_math"] = False print("Taichi is available. Initializing Taichi with parameters:", ti_params) ti_or_fallback.init(**ti_params) if not _IS_TAICHI_AVAILABLE: _USE_TAICHI = False print ("Taichi is not available. Falling back to classic Python implementation.") else: _USE_TAICHI = False
[docs] def is_taichi_used() -> bool: """ Check whether Taichi acceleration is currently enabled. Returns ------- bool `True` if Taichi acceleration is enabled, `False` otherwise. """ return _USE_TAICHI
[docs] class TaichiContext: """ A context manager for temporarily enabling Taichi acceleration within a block of code. Parameters ---------- **ti_params Additional parameters to pass to `ti.init()` when enabling Taichi. See :func:`use_taichi` for more details on the available parameters. Example ------- .. code-block:: python with TaichiContext(): # Code in this block will use Taichi acceleration if available ... """ def __init__(self, **ti_params): self.ti_params = ti_params def __enter__(self): use_taichi(True, **self.ti_params) def __exit__(self, exc_type, exc_val, exc_tb): use_taichi(False)
[docs] @runtime_checkable class TaichiCompatible(Protocol): """ A protocol for objects that are compatible with Taichi acceleration. """
[docs] def __call__(self, *args, **kwargs): ...
def _call_taichi_func(self, *args, **kwargs): ... def _call_taichi_kernel(self, *args, **kwargs): ... def _call_taichi(self, *args, **kwargs): ...
[docs] @runtime_checkable class TaichiConvertible(Protocol): """A protocol for objects that can be converted to a Taichi-compatible form."""
[docs] def to_taichi(self, *args, **kwargs) -> TaichiCompatible: """Convert the object to a Taichi-compatible object.""" ...