跳转到主要内容

Python数组数学(MOA)

项目描述

Build Status Documentation Status Binder

数组数学(MOA)

MOA是一种处理数组的数学严谨方法,由Lenore Mullins开发。MOA遵循以下原则。

  1. 一切都是数组,并且具有形状。标量。向量。NDArray。

  2. 计算每一步的形状是什么?

回答这个问题可以确保没有越界索引,并且有一个有效的运行程序。

  1. 生成给定索引所需的是什么索引和操作?

一旦我们解决了这一步,我们就得到了计算的最小表示,它具有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

开发理念

这是一个概念验证,应受假设和目标指导。

  1. 假设每个操作维度是已知的。通过不太多的工作,这个条件可以放宽到知道一个上限。

  2. MOA 编译器被设计为模块化的,具有清晰的分离:解析、形状计算、DNF 归约、ONF 归约和代码生成。

  3. 所有代码都是基于逻辑可以移植到任何低级语言(例如 C)的思想编写的。这意味着没有面向对象的设计,使用简单的数据结构。字典应该是使用的高级数据结构。

  4. 性能不是一个大问题,相反可读性应该是首选。此代码的目标是作为 MOA 初学者的文档。记住,测试也常常是很好的文档形式。

  5. 应避免运行时依赖项。测试(pytest、hypothesis)和可视化(graphviz)是合适的例外。

贡献

欢迎贡献!对于错误报告或请求,请提交一个问题。

作者

原始作者是 Christopher Ostrouchov。使此项目成为可能的支持来自 Quansight LLC

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

python-moa-0.5.1.tar.gz (33.7 kB 查看哈希值)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面