Source code for numpoly.construct.symbols

"""Construct symbol variables."""
from typing import Optional, Sequence
import re

import numpy
import numpy.typing

import numpoly
from ..baseclass import ndpoly


[docs]def symbols( names: Optional[Sequence[str]] = None, asarray: bool = False, dtype: numpy.typing.DTypeLike = "i8", allocation: Optional[int] = None, ) -> ndpoly: """ Construct symbol variables. Most directly be providing a list of string names. But a set of shorthands also exists: * ``,`` and `` `` (space) can be used as a variable delimiter. * ``{number}:{number}`` can be used to define a numerical range. * ``{letter}:{letter}`` can be used to define a alphabet range. Args: names: Indeterminants are determined by splitting the string on space. If iterable of strings, indeterminants defined directly. asarray: Enforce output as array even in the case where there is only one variable. dtype: The data type of the polynomial coefficients. allocation: The maximum number of polynomial exponents. If omitted, use length of exponents for allocation. Return: Polynomial array with unit components in each dimension. Example: >>> numpoly.symbols() polynomial(q0) >>> numpoly.symbols("q4") polynomial(q4) >>> numpoly.symbols("q:7") polynomial([q0, q1, q2, q3, q4, q5, q6]) >>> numpoly.symbols("q3:6") polynomial([q3, q4, q5]) >>> numpoly.symbols(["q0", "q3", "q99"]) polynomial([q0, q3, q99]) """ if names is None: coefficients = [numpy.ones(1, dtype=dtype)] out = numpoly.ndpoly.from_attributes( exponents=[(1,)], coefficients=coefficients, dtype=dtype, allocation=allocation, ) if not asarray: out = numpoly.aspolynomial(out[0]) return out if not isinstance(names, str): names = tuple(names) else: names = re.sub(" ", ",", names) if "," in names: asarray = True names = tuple(name for name in names.split(",") if name) else: match = re.search(r"(\d*):(\d+)", names) if match: start = int(match.group(1) or 0) end = int(match.group(2)) names = tuple( names.replace(match.group(0), str(idx)) for idx in range(start, end) ) else: names = (names,) assert isinstance(names, tuple) exponents = numpy.eye(len(names), dtype=int) coefficients = numpy.eye(len(names), dtype=dtype) out = numpoly.ndpoly.from_attributes( exponents=exponents, coefficients=coefficients, names=names, allocation=allocation, ) if out.size == 1 and not asarray: return numpoly.aspolynomial(out[0]) return out