python数组数学(moa)
python-moa的Python项目详细描述
阵列数学(MOA)
MOA是处理数组的数学严格方法 是由Lenore Mullins开发的。MOA被引导 遵循以下原则。
一切都是一个数组,都有一个形状。鳞片。向量。恩达雷。
在计算的每个步骤中,计算的形状是什么?
回答此守护人没有越界标引和有效 正在运行程序。
- 生产给定产品所需的指标和操作是什么? 结果中的索引?
一旦我们解决了这个步骤,我们就有了 具有Church Rosser的计算 财产。允许我们真正比较算法,分析 算法,最后映射到一个低级的算法 实施。有关更多问题,请参见 documentation。这个 文档提供了理论、实现细节和 引导。
指导开发的重要问题:
- [X]在只知道维度的情况下,MOA的简单实现是可能的吗?
- [X]我们是否可以表示复杂的操作和einsum math:requires
+red, transpose
? - []阵列的接口是什么?(形状、索引功能) 如何包装预先存在的数值例程?
安装
pip install python-moa
文档
文档可在
python-moa.readthedocs.org。这个
文档提供了理论、实现细节和
python-moa
的开发和使用指南。
示例
一些维护良好的Jupyter笔记本可用于 试验 binder
python前端ast生成
frommoa.frontendimportLazyArrayA=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.jitdeff(A,B):if(not((len(B.shape)==2)and(len(A.shape)==2))):raiseException('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]))))):raiseException('arguments have invalid shape')_a17=numpy.zeros((2,))for_i3inrange(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
码头工人
nix-build moa.nix -A docker
docker load < result
发展理念
这是一个概念的证明,应该以假设和 目标。
假设维度是已知的每个操作。这种情况 没有多少工作可以轻松地知道一个上限。
MOA编译器设计为模块化,具有清晰的分隔: 解析、形状计算、dnf缩减、onf缩减和代码 一代人。
所有的代码都是以逻辑可以移植到任何 低级语言(例如C)。这意味着没有面向对象的 设计和使用简单的数据结构。字典应该是 使用的最高级别数据结构。
性能不是一个大问题,而是可读性应该是 首选。此代码的目标是作为 MOA初学者。记住,测试通常是 文件也是。
应避免运行时依赖关系。测试(pytest,假设) 可视化(graphviz)是适当异常的示例。
贡献
欢迎投稿!对于错误报告或请求,请提交问题。
作者
原作者是Christopher Ostrouchov。资金使得这个 可能的项目来自Quansight LLC。