Source code for pytblis.defaultorder
from contextlib import contextmanager
from contextvars import ContextVar
# You really shouldn't be mixing pytblis with Python threading,
# but we'll use contextvars just in case.
from typing import Literal, Union
_default_order: ContextVar[Literal["C", "F"]] = ContextVar("default_order", default="C")
[docs]
@contextmanager
def use_default_array_order(order: Literal["C", "F"]):
"""Create a temporary context in which pytblis creates new arrays
with the specified memory order (either 'C' or 'F').
Example:
>>> A = np.random.random((100, 100))
>>> B = np.random.random((100, 100))
>>> with pytblis.use_default_array_order('F'):
>>> C = pytblis.contract('ij,jk->ik', A, B)
>>> assert C.flags.f_contiguous
"""
if order not in ("C", "F"):
raise ValueError("order must be one of 'C' or 'F'")
prev_order = _default_order.get()
_default_order.set(order)
try:
yield
finally:
_default_order.set(prev_order)
def get_default_array_order() -> Union[Literal["C"], Literal["F"]]:
"""Get the current default array order for new arrays created by
pytblis.
"""
return _default_order.get()