Python数组数学(MOA)
项目描述
数组数学(MOA)
MOA是一种处理数组的数学严谨方法,由Lenore Mullins开发。MOA遵循以下原则。
-
一切都是数组,并且具有形状。标量。向量。NDArray。
-
计算每一步的形状是什么?
回答这个问题可以确保没有越界索引,并且有一个有效的运行程序。
- 生成给定索引所需的是什么索引和操作?
一旦我们解决了这一步,我们就得到了计算的最小表示,它具有Church Rosser属性。这使我们能够真正比较算法、分析算法,并将算法映射到低级实现。有关进一步问题,请参阅文档。文档提供了理论、实现细节和指南。
将指导开发的重要问题
- 仅知道维度是否可以简单地实现moa?
- 我们能否表示复杂运算和einsum数学:需要
+red, transpose
? - 数组的接口是什么?(形状,索引函数)
- 如何包装现有的数值例程?
安装
pip install python-moa
文档
文档可在 python-moa.readthedocs.org 上找到。该文档提供了 python-moa
的理论、实现细节以及开发和使用指南。
示例
一些维护良好的 jupyter 笔记本可供使用 binder 进行实验。
Python 前端 AST 生成
from moa.frontend import LazyArray
A = LazyArray(name='A', shape=(2, 3))
B = LazyArray(name='B', shape=(2, 3))
expression = ((A + B).T)[0]
expression.visualize(as_text=True)
psi(Ψ)
├── Array _a2: <1> (0)
└── transpose(Ø)
└── +
├── Array A: <2 3>
└── Array B: <2 3>
形状计算
expression.visualize(stage='shape', as_text=True)
psi(Ψ): <2>
├── Array _a2: <1> (0)
└── transpose(Ø): <3 2>
└── +: <2 3>
├── Array A: <2 3>
└── Array B: <2 3>
归约到 DNF
expression.visualize(stage='dnf', as_text=True)
+: <2>
├── psi(Ψ): <2>
│ ├── Array _a6: <2> (_i3 0)
│ └── Array A: <2 3>
└── psi(Ψ): <2>
├── Array _a6: <2> (_i3 0)
└── Array B: <2 3>
归约到 ONF
expression.visualize(stage='onf', as_text=True)
function: <2> (A B) -> _a17
├── if (not ((len(B.shape) == 2) and (len(A.shape) == 2)))
│ └── error arguments have invalid dimension
├── if (not ((3 == B.shape[1]) and ((2 == B.shape[0]) and ((3 == A.shape[1]) and (2 == A.shape[0])))))
│ └── error arguments have invalid shape
├── initialize: <2> _a17
└── loop: <2> _i3
└── assign: <2>
├── psi(Ψ): <2>
│ ├── Array _a18: <1> (_i3)
│ └── Array _a17: <2>
└── +: <2>
├── psi(Ψ): <2>
│ ├── Array _a6: <2> (_i3 0)
│ └── Array A: <2 3>
└── psi(Ψ): <2>
├── Array _a6: <2> (_i3 0)
└── Array B: <2 3>
生成 Python 源代码
print(expression.compile(backend='python', use_numba=True))
@numba.jit
def f(A, B):
if (not ((len(B.shape) == 2) and (len(A.shape) == 2))):
raise Exception('arguments have invalid dimension')
if (not ((3 == B.shape[1]) and ((2 == B.shape[0]) and ((3 == A.shape[1]) and (2 == A.shape[0]))))):
raise Exception('arguments have invalid shape')
_a17 = numpy.zeros((2,))
for _i3 in range(0, 2):
_a17[(_i3,)] = (A[(_i3, 0)] + B[(_i3, 0)])
return _a17
开发
下载 nix。没有其他依赖项,所有构建在 Linux 和 OSX 上都将相同。
演示
jupyter
环境
nix-shell dev.nix -A jupyter-shell
ipython
环境
nix-shell dev.nix -A ipython-shell
测试
nix-build dev.nix -A python-moa
包括基准测试(numba、numpy、pytorch、tensorflow)
nix-build dev.nix -A python-moa --arg benchmark true
文档
nix-build dev.nix -A docs
firefox result/index.html
Docker
nix-build moa.nix -A docker
docker load < result
开发理念
这是一个概念验证,应受假设和目标指导。
-
假设每个操作维度是已知的。通过不太多的工作,这个条件可以放宽到知道一个上限。
-
MOA 编译器被设计为模块化的,具有清晰的分离:解析、形状计算、DNF 归约、ONF 归约和代码生成。
-
所有代码都是基于逻辑可以移植到任何低级语言(例如 C)的思想编写的。这意味着没有面向对象的设计,使用简单的数据结构。字典应该是使用的高级数据结构。
-
性能不是一个大问题,相反可读性应该是首选。此代码的目标是作为 MOA 初学者的文档。记住,测试也常常是很好的文档形式。
-
应避免运行时依赖项。测试(pytest、hypothesis)和可视化(graphviz)是合适的例外。
贡献
欢迎贡献!对于错误报告或请求,请提交一个问题。
作者
原始作者是 Christopher Ostrouchov。使此项目成为可能的支持来自 Quansight LLC。
项目详情
python-moa-0.5.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 006c7477d6a507b62497fa18c2af46d56c85f83c0fa0e6f129e6fe673aa48c7a |
|
MD5 | 59cc94fea114d0914ab15e11760343c4 |
|
BLAKE2b-256 | 3bcd349176401c49ca749f3b2c6bc9523d4ce7486be5a6765979066bf1d582c4 |