Series

Series representation of derivative table

ndmap.series.clean(probe: dict[tuple[int, ...], torch.Tensor], *, epsilon: float = 2.5e-16) dict[tuple[int, ...], torch.Tensor][source]

Clean series

Parameters:
  • probe (Series) – input series to clean

  • epsilon (float, non-negative) – clean epsilon

Return type:

Series

Examples

>>> import torch
>>> from ndmap.derivative import derivative
>>> def fn(x, y):
...    x1, x2 = x
...    y1, y2 = y
...    return torch.stack([x1*(1 + y1), x2*(1 + y2)])
>>> x = torch.tensor([0.0, 0.0])
>>> y = torch.zeros_like(x)
>>> t = derivative((1, 1), fn, x, y)
>>> s = series((2, 2), (1, 1), t)
>>> clean(s)
{(1, 0, 0, 0): tensor([1., 0.]),
 (0, 1, 0, 0): tensor([0., 1.]),
 (1, 0, 1, 0): tensor([1., 0.]),
 (0, 1, 0, 1): tensor([0., 1.])}
ndmap.series.fetch(probe: dict[tuple[int, ...], torch.Tensor], index: list[tuple[int, ...]]) dict[tuple[int, ...], torch.Tensor][source]

Fetch series

Parameters:
  • probe (Series) – input series

  • index (list[tuple[int, ...]], non-negative) – list of monomial indices, […, (i, j, k, …), …]

Return type:

Series

Examples

>>> import torch
>>> from ndmap.derivative import derivative
>>> def fn(x, y):
...    x1, x2 = x
...    y1, y2 = y
...    return torch.stack([x1*(1 + y1), x2*(1 + y2)])
>>> x = torch.tensor([0.0, 0.0])
>>> y = torch.zeros_like(x)
>>> t = derivative((1, 1), fn, x, y)
>>> s = series((2, 2), (1, 1), t)
>>> fetch(s, [(1, 0, 0, 0), (1, 0, 1, 0)])
{(1, 0, 0, 0): tensor([1., 0.]), (1, 0, 1, 0): tensor([1., 0.])}
ndmap.series.merge(probe: dict[tuple[int, ...], torch.Tensor], other: dict[tuple[int, ...], torch.Tensor]) dict[tuple[int, ...], torch.Tensor][source]

Merge (sum) series

Parameters:
  • probe (Series) – input series to merge

  • other (Series) – input series to merge

Return type:

Series

Examples

>>> import torch
>>> from ndmap.derivative import derivative
>>> def fn(x, y):
...    x1, x2 = x
...    y1, y2 = y
...    return torch.stack([x1*(1 + y1), x2*(1 + y2)])
>>> x = torch.tensor([0.0, 0.0])
>>> y = torch.zeros_like(x)
>>> t = derivative((1, 1), fn, x, y)
>>> s = series((2, 2), (1, 1), t)
>>> merge(s, s)
{(0, 0, 0, 0): tensor([0., 0.]),
 (0, 0, 1, 0): tensor([0., 0.]),
 (0, 0, 0, 1): tensor([0., 0.]),
 (1, 0, 0, 0): tensor([2., 0.]),
 (0, 1, 0, 0): tensor([0., 2.]),
 (1, 0, 1, 0): tensor([2., 0.]),
 (1, 0, 0, 1): tensor([0., 0.]),
 (0, 1, 1, 0): tensor([0., 0.]),
 (0, 1, 0, 1): tensor([0., 2.])}
ndmap.series.series(index: list[tuple[int, ...]], function: Callable, state: torch.Tensor, knobs: list[torch.Tensor], *pars: tuple, jacobian: Callable | None = None) dict[tuple[int, ...], torch.Tensor]

Generate series representation of a given function for a given set of monomial indices

ndmap.series.split(probe: dict[tuple[int, ...], torch.Tensor]) list[dict[tuple[int, ...], torch.Tensor]][source]

(series operation) Split series

Note, coefficient values are assumed to be vector tensors

Parameters:

probe (Series) – input series

Return type:

list[Series]

Examples

>>> import torch
>>> from ndmap.derivative import derivative
>>> def fn(x, y):
...    x1, x2 = x
...    y1, y2 = y
...    return torch.stack([x1*(1 + y1), x2*(1 + y2)])
>>> x = torch.tensor([0.0, 0.0])
>>> y = torch.zeros_like(x)
>>> t = derivative((1, 1), fn, x, y)
>>> s = series((2, 2), (1, 1), t)
>>> split(s)
[{(0, 0, 0, 0): tensor(0.),
  (0, 0, 1, 0): tensor(0.),
  (0, 0, 0, 1): tensor(0.),
  (1, 0, 0, 0): tensor(1.),
  (0, 1, 0, 0): tensor(0.),
  (1, 0, 1, 0): tensor(1.),
  (1, 0, 0, 1): tensor(0.),
  (0, 1, 1, 0): tensor(0.),
  (0, 1, 0, 1): tensor(0.)},
 {(0, 0, 0, 0): tensor(0.),
  (0, 0, 1, 0): tensor(0.),
  (0, 0, 0, 1): tensor(0.),
  (1, 0, 0, 0): tensor(0.),
  (0, 1, 0, 0): tensor(1.),
  (1, 0, 1, 0): tensor(0.),
  (1, 0, 0, 1): tensor(0.),
  (0, 1, 1, 0): tensor(0.),
  (0, 1, 0, 1): tensor(1.)}]