Source code for numpoly.option

"""Global numpoly options."""
from typing import Any, Dict, Iterator
from contextlib import contextmanager

GLOBAL_OPTIONS_DEFAULTS = {
    "default_varname": "q",
    "display_graded": True,
    "display_reverse": False,
    "display_inverse": True,
    "display_exponent": "**",
    "display_multiply": "*",
    "force_number_suffix": True,
    "retain_names": True,
    "retain_coefficients": False,
    "sort_graded": True,
    "sort_reverse": False,
    "varname_filter": r"q\d+",
}
_NUMPOLY_OPTIONS = GLOBAL_OPTIONS_DEFAULTS.copy()


[docs]def get_options(defaults: bool = False) -> Dict[str, Any]: """ Get global numpoly options. Args: defaults: Return the options for the global option defaults, instead of the options currently in use. Return: Collection of values that affect the numpoly machinery. See `numpoly.set_options` for details. Example: >>> options = get_options() >>> options["default_varname"] 'q' Note: `set_options`, `global_options` """ if defaults: return GLOBAL_OPTIONS_DEFAULTS.copy() return _NUMPOLY_OPTIONS.copy()
[docs]def set_options(**kwargs: Any) -> None: """ Set global numpoly options. Args: default_varname: Polynomial indeterminant defaults, if not defined explicitly. display_graded: When displaying polynomials as strings, sort polynomial sums in graded order. display_reverse: When displaying polynomials as strings, sort polynomial sums in reversed lexicographical order. display_inverse: If true, display polynomials from smallest to largest exponent. display_exponent: Exponent sign; Separate indeterminants and its power. display_multiply: Multiplication sign; Separates coefficients and indeterminants, and indeterminants from each other. force_number_suffix: Add a postfix index to single indeterminant name. If single indeterminant name, e.g. 'q' is provided, but the polynomial is multivariate, an extra postfix index is added to differentiate the names: 'q0, q1, q2, ...'. If true, enforce this behavior for single variables as well such that 'q' always get converted to 'q0'. retain_coefficients: After each operation a cleanup is done to reduce the polynomial to its smallest memory imprint. If true, do not remove redundant coefficients (consisting of only zeros). retain_names: After each operation a cleanup is done to reduce the polynomial to its smallest memory imprint. If true, do not remove redundant names (not represented in polynomial anymore). sort_graded: Graded sorting, meaning the indices are always sorted by the index sum. E.g. ``x**2*y**2*z**2`` has an exponent sum of 6, and will therefore be consider larger than both ``x**3*y*z``, ``x*y**2*z and ``x*y*z**2``, which all have exponent sum of 5. sort_reverse: Reverse lexicographical sorting meaning that ``x*y**3`` is considered bigger than ``x**3*y``, instead of the opposite. varname_filter: Regular expression defining valid indeterminant names. Example: >>> numpoly.monomial([3, 3]) polynomial([1, q0, q0**2, q1, q0*q1, q1**2]) >>> numpoly.set_options(default_varname="z", varname_filter=".+") >>> numpoly.monomial([3, 3]) polynomial([1, z0, z0**2, z1, z0*z1, z1**2]) Note: `get_options`, `global_options` """ for key in kwargs: if key not in _NUMPOLY_OPTIONS: raise KeyError(f"option '{key}' not recognized.") _NUMPOLY_OPTIONS.update(**kwargs)
[docs]@contextmanager def global_options(**kwargs: Any) -> Iterator[Dict[str, Any]]: """ Temporarily set global numpoly options. Args: kwargs: Collection of values that deviate from the defaults. See `numpoly.set_options` for details. Yield: Collection of values that affect the numpoly machinery. See `numpoly.set_options` for details. Example: >>> numpoly.get_options()["default_varname"] 'q' >>> with numpoly.global_options(default_varname="X"): ... print(numpoly.get_options()["default_varname"]) X >>> numpoly.get_options()["default_varname"] 'q' Note: `get_options`, `set_options` """ options = get_options() set_options(**kwargs) try: yield get_options() finally: set_options(**options)