|
| 1 | +from collections.abc import Callable, Generator, Iterable, Sequence |
| 2 | +from types import ModuleType |
| 3 | +from typing import Concatenate, Generic, TypeAlias |
| 4 | +from typing_extensions import TypeVar, override |
| 5 | + |
| 6 | +import numpy as np |
| 7 | +import optype.numpy as onp |
| 8 | +import optype.numpy.compat as npc |
| 9 | + |
| 10 | +_NumberT = TypeVar("_NumberT", bound=npc.number) |
| 11 | +_NumberT_co = TypeVar("_NumberT_co", bound=npc.number, default=np.float64, covariant=True) |
| 12 | +_XPT_co = TypeVar("_XPT_co", default=ModuleType, covariant=True) |
| 13 | + |
| 14 | +_IntegrandFunc: TypeAlias = Callable[Concatenate[onp.Array2D[_NumberT], ...], onp.ArrayND[npc.number]] |
| 15 | + |
| 16 | +### |
| 17 | + |
| 18 | +class Rule(Generic[_XPT_co]): # undocumented |
| 19 | + xp: _XPT_co | None |
| 20 | + |
| 21 | + def estimate( |
| 22 | + self, /, f: _IntegrandFunc[_NumberT], a: onp.ArrayND[_NumberT], b: onp.ArrayND[_NumberT], args: tuple[object, ...] = () |
| 23 | + ) -> onp.ArrayND[_NumberT]: ... # abstract |
| 24 | + def estimate_error( |
| 25 | + self, /, f: _IntegrandFunc[_NumberT], a: onp.ArrayND[_NumberT], b: onp.ArrayND[_NumberT], args: tuple[object, ...] = () |
| 26 | + ) -> onp.ArrayND[_NumberT]: ... |
| 27 | + |
| 28 | +class FixedRule(Rule[_XPT_co], Generic[_XPT_co, _NumberT_co]): # undocumented |
| 29 | + def __init__(self) -> None: ... |
| 30 | + @property |
| 31 | + def nodes_and_weights(self) -> tuple[onp.ArrayND[_NumberT_co], onp.ArrayND[_NumberT_co]]: ... # abstract |
| 32 | + |
| 33 | +class NestedFixedRule(FixedRule[_XPT_co, _NumberT_co], Generic[_XPT_co, _NumberT_co]): # undocumented |
| 34 | + higher: FixedRule[_XPT_co, _NumberT_co] |
| 35 | + lower: FixedRule[_XPT_co, _NumberT_co] |
| 36 | + @override |
| 37 | + def __init__(self, /, higher: FixedRule[_XPT_co, _NumberT_co], lower: FixedRule[_XPT_co, _NumberT_co]) -> None: ... |
| 38 | + @property |
| 39 | + def lower_nodes_and_weights(self) -> tuple[onp.ArrayND[_NumberT_co], onp.ArrayND[_NumberT_co]]: ... # semi-abstract |
| 40 | + |
| 41 | +class ProductNestedFixed(NestedFixedRule[_XPT_co, _NumberT_co], Generic[_XPT_co, _NumberT_co]): |
| 42 | + base_rules: Sequence[NestedFixedRule[_XPT_co, _NumberT_co]] |
| 43 | + @override |
| 44 | + def __init__(self, /, base_rules: Sequence[NestedFixedRule[_XPT_co, _NumberT_co]]) -> None: ... |
| 45 | + |
| 46 | +def _cartesian_product(arrays: Iterable[onp.ArrayND[_NumberT]]) -> onp.Array2D[_NumberT]: ... # undocumented |
| 47 | +def _split_subregion( |
| 48 | + a: onp.ArrayND[_NumberT], b: onp.ArrayND[_NumberT], xp: ModuleType, split_at: onp.ArrayND[_NumberT] | None = None |
| 49 | +) -> Generator[tuple[onp.ArrayND[_NumberT], onp.ArrayND[_NumberT]]]: ... # undocumented |
| 50 | +def _apply_fixed_rule( |
| 51 | + f: _IntegrandFunc[_NumberT], |
| 52 | + a: onp.ArrayND[_NumberT], |
| 53 | + b: onp.ArrayND[_NumberT], |
| 54 | + orig_nodes: onp.ArrayND[npc.number], |
| 55 | + orig_weights: onp.ArrayND[npc.number], |
| 56 | + args: tuple[object, ...], |
| 57 | + xp: ModuleType, |
| 58 | +) -> onp.ArrayND[_NumberT]: ... # undocumented |
0 commit comments