Lappy ===== ``Lappy`` is a fork of Sophia Lin's ``lazyray`` that supports more operations beyond arithmetics. Scope ----- What are planned to be supported: - [ ] Arithmetic and scalar mathematics - [ ] Scan and fold - [ ] Tensor contractions, einsum (including dot products and matrix multiply) - [ ] Axis reordering / transpose - [ ] Slicing and broadcasting (static and dynamic) - [ ] Fancy indexing (static and dynamic) - [ ] Reshaping - [ ] Integration with Numpy's dispatch mechanism like ``__array__`` and ``__array_ufunc__`` - [ ] Some linear algebra like ``svd``, ``qr``, ``lstsq`` What are planned to be **not** supported: - [x] In-place primitives (rhs of any assignment is conceptually functional), e.g., in-place quick sort. Although the generated code may be in-place for ``A = sorted(A)``, it is up to the optimizer and not semantically guaranteed. - [x] Every feature of an APL-like IR. Semantics --------- In-place assignment ******************* Like ``numpy``, each statement is considered one functional transaction with no hidden sequential side effects, even the variable appears in both rhs and lhs. For example, ``x = (diag(A)**-1) (b - R x)`` computes one step of Jacobi iteration for solving ``Ax = b`` where ``A = diag(A) + R``. Static vs dynamic indexing ************************** A static indexing like ``A[2:5, ...]`` has the index address known at compile time, and can be handled in a piecewise fashion by ISL. Examples of static indexing include finite difference and linear algebraic algorithms like GMRES. A dynamic indexing like ``A[B]`` has the index address known at runtime and is handled by special nodes. Examples of dynamic indexing include CSR sparse matrices with dynamic sparsity patterns in adaptive tree building and graph algorithms. In general, a statement with dynamic addressing will affect the expression for the whole array, unless the access is bounded by a known subset (e.g., the CSR matrix has bounded bandwidth) specified by the user. ---- ``Lappy`` is licensed under the `MIT license `_ and free for commercial, academic, and private use.