建立在张量代数编译器上的稠密和稀疏张量库。
tensora的Python项目详细描述
Tensora
一个快速且易于使用的python密集/稀疏张量库。使用各种稀疏格式的张量计算任意张量表达式。
张量是矩阵的n维推广。张量不局限于1维或2维,而是可以有3维、4维或更多维。它们在各种应用中都很有用。numpy是python中最著名的张量库;它的中心ndarray
对象是密集张量的一个例子。
在稠密张量中,每个元素都显式地存储在内存中。如果绝大多数元素是零,那么这是一个低效的布局,需要更多的内存存储和更多的时间操作。有许多不同的稀疏张量格式,每一种格式的优劣取决于张量的哪些元素是非零的。
许多张量核(在具有特定稀疏格式的张量之间执行特定代数计算的函数)都是为解决特定问题而编写的。最近,张量代数编译器(taco)被发明来自动构造和优化任意稀疏格式的任意代数表达式的张量核。taco接受一个代数表达式和表达式中每个张量格式的描述,并返回一个c函数,该函数可以有效地计算这些张量参数的给定表达式。
Tensora是一个包裹玉米卷的Python包装器。tensor a有一个中心类tensor
它只是有一个指针指向c内存中保存的taco tensor,由cffi
包管理。tensora公开了采用一个代数表达式字符串并返回python函数的函数,python函数在快速c代码中执行该操作。为了做到这一点,字符串被解析并传递给taco;由taco生成的c代码由cffi"动态"编译,然后由提供良好错误处理的代码包装。
此软件包具有很强的实验性。在没有独立验证任何特定问题的输出之前,不要相信结果。这主要是因为底层的taco编译器本身具有很强的实验性。由于生成的内核中存在已知的底层错误,tensora的大部分测试套件都被跳过。随着对taco的研究不断深入,tensora的测试套件将不断扩充,文档也将不断完善。
开始
Tensora可以使用来自PYPI的PIP
安装:
pip install tensora
类tensor
和函数evaluate
一起为tensora提供了瓷接口。
下面是将csr格式的稀疏矩阵与密集向量相乘的示例:
fromtensoraimportTensor,evaluateelements={(1,0):2.0,(0,1):-2.0,(1,2):4.0,}A=Tensor.from_dok(elements,dimensions=(2,3),format='ds')x=Tensor.from_lol([0,-1,2])y=evaluate('y(i) = A(i,j) * x(j)','d',A=A,x=x)asserty==Tensor.from_lol([2,4])
创建张量
创建张量最好通过
tensor.from_*
方法来完成。这些方法将各种数据类型转换为张量。大多数转换方法都可以选择同时采用
维度和
格式来确定结果张量的维度和格式。
来自"lol"
:列表列表
Tensor.from_lol(lol,*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)
将密集列表转换为张量
lol
是一个列表列表,可能嵌套得很深。也就是说,lol
是一个float
、一个list[float]
、一个list[list[float]
等任意深度到list
s的值。这些值以行主格式读取,这意味着顶级列表是第一个维度和最深的列表(包含actu的列表是最后一个维度。同一级别的所有列表必须具有相同的长度。对于熟悉的人来说,这与通过numpy.array>从列表列表构造数组时的numpy行为相同。
维度有一个默认值,该值是从
lol
的结构中推断出来的。如果PR提供时,它必须与lol
的结构一致。提供尺寸通常仅在一个或多个非最终尺寸可能为零时才有用。例如,tensor.from_lol([[],[]])
的维数为(2,0)
,而tensor.from_lol([[],[]],dimensions=(2,0,3))
的维数为(2,0,3)
。format
具有所有密集维度的默认值。
来自"Dok"
:钥匙字典
Tensor.from_dok(dok:Dict[Tuple[int,...],float],*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)
将键字典转换为张量
dok
是一个python字典,其中每个键是一个非零值的坐标,条目的值是该坐标处张量的值。所有未提及的坐标都隐式为零。尺寸
有一个默认值,该值是在坐标中找到的每个尺寸中最大的尺寸。format
的默认值是密集维度,只要非零的数量大于这些维度的乘积,然后是稀疏维度。默认值随经验的变化而变化。
来自AOS
:结构数组
Tensor.from_aos(aos:Iterable[Tuple[int,...]],values:Iterable[float],*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)
将坐标列表和相应的值列表转换为张量
aos
是非零值的坐标值。值
的长度必须与aos
的长度相同,并且每个值都是对应坐标处的非零值。尺寸
与张量具有相同的默认值。从u dok
开始,每个尺寸中的最大尺寸。格式
与张量具有相同的默认值。从'u dok
开始,根据需要对许多维度进行密集以适合非零。
来自AOS
:数组结构
Tensor.from_soa(soa:Tuple[Iterable[int],...],values:Iterable[float],*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)
将每个维度的索引列表和相应的值列表转换为张量
soa
是iterable的元组,其中每个iterable是对应维度的所有索引。所有电缆长度必须相同。值
必须与坐标系中的iterable长度相同,并且每个值都是对应坐标系下的非零值。尺寸
与张量具有相同的默认值。从u dok
开始,每个尺寸中的最大尺寸。格式
与张量具有相同的默认值。从'u dok
开始,根据需要对许多维度进行密集以适合非零。
从numpy中
:转换numpy数组
Tensor.from_numpy(array:numpy.ndarray,*,format:Union[Format,str]=None)
将numpy数组转换为张量
数组是任意数组。生成的张量将具有相同的顺序、维数和数组值。
format
具有所有密集维度的默认值。
来自scipy稀疏矩阵
:转换scipy稀疏矩阵
Tensor.from_scipy_sparse(data:scipy.sparse.spmatrix,*,format:Union[Format,str]=None)
将scipy稀疏矩阵转换为张量
matrix
是任意的scipy.sparse.spmatrix
。得到的张量具有相同的顺序、维数和矩阵值。张量的阶数总是2。format
对于csr_matrix
和d1s0
对于csc_matrix
和ds
对于其他稀疏矩阵类型的默认值为ds
,但随着taco添加新的格式模式类型,该值可能会发生更改。
计算表达式
taco为张量核的代数表达式生成核。tensora使用evaluate
函数包装此过程。
evaluate(assignment:str,output_format:str,**inputs:Tensor)
赋值
可作为代数张量赋值。output_format
是输出张量的理想格式。inputs
是表达式的所有输入。赋值中的每个变量名都必须有一个命名参数。
输入中张量的维数必须与
赋值和彼此一致。