GluCat:通用Clifford代数模板的通用库
SourceForge.net项目页面
GluCat项目页面主办地点:
关于GluCat
GluCat公司是一个模板类库,它在实数域上对通用Clifford代数进行建模,具有任意维数和任意签名。GluCat公司实现每个Clifford代数对应于每个达到最大维数的非退化二次型。
GluCat公司类最初设计为用作模板其他模板库的参数,例如闪电战++,处理。二,矩阵模板库和POOMA公司.这些模板库需要一个实现“适当的数字语义”.为了提供这些语义GluCat公司接口匹配浮动或复杂<>尽可能多地,但是GluCat公司类必须不同于浮动或复杂<>,因为他们用不同的代数建模。
接口
命名空间为葡聚糖::,代表通用Clifford代数模板的泛型库.主要模板类有索引集<LO,HI>,framed_multi<标量-T、LO、HI>和矩阵_乘法<标量-T、LO、HI>.标量_T是表示数字字段的类,例如浮动或双重的.LO,一个指数_T<=0和HI,一个索引_T>=0、是索引集中索引的下限和上限。到目前为止,已经完成了测试索引_T作为int和标量_T作为float、double和longdouble。
index_set<LO,HI>的符号如下所示:{-2,3,4},一组具有模板限制的整数。0从未是集合的成员。每个索引集表示发电机的非交换乘积以严格递增的顺序对应于每个索引。这通常称为严格增加多指标在文学作品中。
例如。{-2,3,4} == {-2}*{3}*{4}
输入将索引集视为集,因此{-2,3,4} == {4,3,-2}.产量按递增顺序。
A类装框架的多向量,相对于基表示的多向量,“知道”哪个子代数包含它。它是由框架定义的子代数。A类框架这是一组有序的基向量,它生成一个子代数。
framed_multi和matrix_multi的表示法是加框表示法:1+2{-3}+4{-2}+5{-3,-2,2},即术语的总和,其中每个术语由coordinate和indexset。
framed_multi<float、LO、HI>和matrix_multi<floot、LO和HI>表示的子代数的元素R(高,低).
{-2}*{-2} == -1. {2}*{2} == 1.
加框符号自动处理生成器的签名。无需指定签名即可使用framed_multi或矩阵_multi<>,即此符号中的多重向量的值是明确的。
带负指数的框架符号并不是新出现的。Mark Ashdown在Maple V的GA套装.G.P.Wene在其关于无限维Clifford代数的论文中使用了负指数。Leo Dorst在其关于“珩磨几何代数”.最后,也是最重要的是,阿尔文德·拉贾的设计和原型代码(依据GluCat公司)在内部使用索引集。
framed_multi和matrix_multi提供常用的算术运算符+,-,*和/,以及%左收缩,&用于Hestenes内积和^用于外部产品。它们还提供操作员[]用于使用索引集进行订阅,和运算符()用于分级。
framed_multi和matrix_multi也提供了常用函数,联合,真实的,图像,腹肌,规范,功率,经验,平方英尺,日志,余弦,acos公司,科什,乌头,罪,阿辛,新几内亚,反双曲正弦,棕褐色的,阿坦,坦桑尼亚,反双曲正切,加上多向量函数即使,框架,发票,渐开线,颠倒,纯净的,方庭,标量等。
目的是使符号尽可能接近浮动或复杂<>,而不会偏离Clifford代数的当前符号。
操作
Clifford代数的一个优点是F(P,Q)包含子代数同构于F(p,q)对于p<=p和q<=q。
因此,可以将不同子代数中的多向量相加和相乘。结果通常包含在跨越操作数的子代数中。
如。(2{-1}+3{-2})+(4{1,2}+5{1,4})==2{-1}+3{-2}+4{1,2}+5{1,4}
使用GluCat公司类是使范围LO。。。夏威夷群岛您的程序所需的大小。你可以使用相同的类,比如framed_multi<双精度,-4,4>进行计算在里面R(0,2)(四元数),R(3.0)(3D几何代数),R(0.3)(克利福德分析中使用的三维克利福德代数)和R(1,3)(时空代数)。
更好的是,您可以只让LO和HI使用默认值,这些值对于大多数用途来说都足够大。默认值基于sizeof(设置值t),其中设置值是定义为无符号长.在Intel i386体系结构上,无符号长是32位,默认(_LO)是-16和默认_HI是16.因此,为了适应上面列出的子代数,您可以使用framed_multi<double>。与之相比,这在大小和速度方面带来了较小的开销framed_multi<双精度,-4,4>.在AMD 64或Compaq Alpha上,无符号长为64位,默认(_LO)是-32和默认_HI是32.
性能
在许多情况下,需要在framed_multi和matrix_multi之间进行转换。matrix_multi<>不能直接对不同子代数中的操作数进行运算,因此,这样的操作通过将操作数转换为通过转换到framed_multi<>和从framed_multi<>转换到framed_multi<>的公共子代数。
如果维度数超过阈值,则使用广义快速傅里叶变换。
实施
GluCat公司经许可,将Arvind Raja的原型代码用于基本操作并添加/,发票,平方英尺以及上面列出的超越函数。
类index_set<LO,HI>基于标准::位集<HI-LO+1>.
类framed_multi基于标准::map<index_set<LO,HI>,Scalar_T>或(可选)在__gnu_cxx::hash_map<const index_set<LO,HI>,Scalar_T,hash或标准::tr1::unordered_map<常量index_set<LO,HI>,标量-T,散列.framed_multi类的对象将多向量表示为项的总和,其中每个项由一个基本元素和一个坐标组成。您也可以将其视为从一组索引集到一组坐标值的映射。必要时,framed_multi实现使用标准::pair<index_set<LO,HI>,Scalar_T>表示术语。
类matrix_multi<>由一个矩阵和一个表示定义子代数的框架。matrix_multi<>当前基于乌布拉斯::由提供的模板Boost uBLAS库.GluCat公司当前使用行压缩格式的稀疏矩阵或密集矩阵。
类matrix_multi<>使用最小实数表示的矩阵生成器属于R(p,q)根据波蒂厄斯和卢内斯托。类的单个实例生成器表用于构造和存储生成器。这个类,基于标准::映射,从签名(p,q)到矩阵生成器向量的映射。
除法和求逆目前使用LU分解,加上迭代细化,按照海厄姆.类matrix_multi<>将framed_multi<>用于除+、-、*、/之外的大多数操作。
从framed_multi到matrix_multi的转换使用最小值包含框架multi的子代数。
这个fold()和展开()操作将子代数中的索引集映射到由相应的连续索引集定义的同构子代数。索引集通过定义框架,这是一组有序的基向量。索引集中的索引按顺序定义此有序集。依次,有序基元集生成子代数。这样你就可以想到fold()和展开()如对帧内的基向量进行重新编号。
如。{-4,-2,1,3}.折叠({-4,-2,1,3})=={-2,-1,1,2}
{-2,3}.折叠({-4,-2,1,3})=={-1,2}
矩阵_multi中的运算发生在折叠子代数中。
framed_multi和matrix_multi的通用接口是通过抽象基模板类定义的clifford_algebra<Scalar_T、Index_Set_T、Multivector_T>.这就是我所说的伪多态性.framed_multi和matrix_multi没有公共基类,只有通过模板定义的通用接口。抽象基模板类仅用于定义派生类,不用于图书馆。这将开销保持在最低水平。
实现了两个派生模板类之间通用的非成员函数代码通过使用模板模板函数。
例如,函数平方英尺,经验,日志,余弦,科什,罪,新几内亚,棕褐色的,坦桑尼亚,acos公司,乌头,阿辛,反双曲正弦,阿坦和反双曲正切使用基于矩阵算法和Pade近似的算法,以便对两者使用相同的算法framed_multi和matrix_multi。
这个日志和平方英尺函数基于Pade近似和矩阵算法最近由Cheng、Higham、Kenney和Laub出版。
这个经验函数基于Pade近似,其他超越函数为基于经验和日志.参考文献包括阿布拉莫维茨(Abramowitz)和斯特根(Stegun)、杰拉尔德(Gerald)和惠特利(Wheatley)、戈卢布(Golub)和范·洛恩(van Loan)。详见下文。
限制
GluCat使用C++标准库和Boost库。在尝试使用GluCat之前,请确保已安装并运行了这些工具。使用Boost下载页面以获取Boost Library。
确保您安装了与GluCat使用的g++版本相同的Boost。
标头需要一个能正确处理模板类的编译器。
GluCat 0.4.0尚未在1.33.0之前的Boost版本上进行测试。
对于g++4.0.0和g++4.01,使用-O3进行优化可能会损坏迭代器。使用-O3-fno-strict-aliasing代替。参见gcc错误23599。
迄今为止,GluCat 0.4.0已通过以下方法进行测试:
- 双英特尔(R)奔腾(R)4,Kubuntu 7.10,gcc版本4.1.3,Boost 1.33.1
- AMD Athlon(tm)64,SuSE Linux 10.1,带
- g++4.1.0,g++4.2.2,icpc 10.0 Build 20070426,
- 提高1.33.0、1.33.1、1.34.0、1.34.1。
待办事项
还有大量测试、清理、打包和文档工作要做。
- 改进示例和测试程序的打包。
- 编写一份程序员指南,说明API。
- 测试并建议改进John Fletcher对Ruby和Henk Jansen的SWIG绑定到Python。
- 简化并改进automake和autoconf在构建GluCat中的使用。
- 调查GluCat是否可以用作Christian Perwass的CLU的后端。
- 用Blitz++测试,成交。二、 MTL、POOMA和uBLAS并进行相应调整。
- 支持模板模板的其他体系结构和编译器的端口参数。
先验功能仍需改进。
- 修正sqrt()和log(),使它们能够正确处理负实特征值。
- 为现有算法设计更好的算法和更好的实现超越函数。尤其要注意收敛性、矩阵的条件数和子代数的凸出。
- 尝试使用复杂的矩阵表示法。它们使用较小的矩阵,这应该更快。这将意味着对basis_element()的更改,folded_dim()和其他。可以将其作为附加模板类交付而不是更改matrix_multi。
- 尝试定义Boost概念和更多数字特征,以便GluCat最终可以成为Boost库。
接口和库可以通过多种不同的方式进一步改进。
- 尝试重构matrix_multi、framed_multi和clifford_algebra允许模板参数具有更大的灵活性。可能使用启用_if和SFINAE来做这件事。
- 尝试将Matrix_Tag模板参数添加到framed_multi和Matrix_multi,确定矩阵t是否压缩、致密等。
- 尝试从framed_multi和matrix_multi,并在framed_multi.h、matrx_multi.h等。
- 尝试将Tune_P设置为mixin策略类模板参数。
- 几何运算的加法运算符|:return rhs*lhs*渐开线(inv(rhs))
- 将便利构造函数添加到index_set<>:index_set<>(int,int),索引集<>(int,int,int)。。。等。
- 为framed_multi<complex<>>等提供更好的支持和测试。
- 尝试用加法和替换内积中的乘法+/-1减法。
- 尝试创建一个类vector_multi<>,它使用std::vector而不是标准::映射。如果调整得当,这应该比framed_multi快全多向量。对于稀疏多向量,速度可能较慢。
演示文稿
出版物
作者
保罗·雷奥帕迪
项目主管
威廉·麦克莱恩博士,新南威尔士州数学学院。
原型
阿文德·拉贾
Arvind Raja的原型是由Pertti Lounesto、R.Mikkola和V.Vierros以Clical为原型制作的。
建议
- A.Alexandrescu、N.Josuttis、A.Koenig、Scott Meyers、B.Moo、Bjarne Stroustrup、T.Veldhuizen:
- C++用法。
- 乔格·阿恩特(Joerg Arndt):
- 有点神奇。
- 杜瑞德·马迪纳(Duraid Madina)、罗素·斯坦迪什(Russell Standish):
- C++,调试。
- 克里斯蒂安·佩瓦斯(Christian Perwass):
- 操作员,用户界面。
定义
- 米尔顿·阿布拉莫维奇(Milton Abramowicz)和艾琳·阿斯特根(Irene A.Stegun):
- 先验功能。
- Mark Ashdown,G.P.Wene:
- 负整数索引。
- Chris Doran、David Hestenes、Anthony Lasenby、Pertti Lounesto、Ian R.Porteous、Garret Sobczyk:
- Clifford代数和、差、内积、外积,几何乘积、对合和反对合、规范。
- 利奥·多斯特:
- 左收缩。
- 利奥·多斯特(Leo Dorst),阿文德·拉贾(Arvind Raja):
- 索引集。
- David Hestenes、Garret Sobczyk、G.P.Wene:
- 无数无限维Clifford代数。
- 佩蒂·卢内斯托(Pertti Lounesto),伊恩·波蒂厄斯(Ian R.Porteous):
- 矩阵基础。
算法
- Milton Abramowicz和Irene A.Stegun,Gene H.Golub,Charles F.van Loan,C.F.Gerald,P.O.Wheatley:
- 先验功能。
- 乔格·阿恩特(Joerg Arndt):
- 索引集上的位函数。
- Sheung Hun Cheng、Nicholas J.Higham、Charles S.Kenney、Alan J.Laub:
- Denman-Beavers平方根迭代的乘积形式,不完全平方根级联对数。
- 利奥·多斯特:
- 左收缩。
- P.Fleckenstein:
- framed_multi几何积
- Gene H.Golub、Charles F.van Loan、Nicholas J.Higham:
- 矩阵划分,迭代求精。
- Gene H.Golub、Charles F.van Loan:
- 矩阵指数。
- Gene H.Golub、Charles F.van Loan、C.F.Gerald、P.O.Wheatley、Doron Zeilberger:
- Pade近似。
- 佩蒂·卢内斯托(Pertti Lounesto),伊恩·波蒂厄斯(Ian R.Porteous):
- 矩阵基础
.- A.Lumsdaine,J.Siek,MTL项目:
- 矩阵算法和线性代数。
- 阿尔文德·拉贾(Arvind Raja):
- framed_multi<>和、差、内积、外积,几何乘积、对合和反对合、规范。
- Joerg Walter,uBLAS项目:
- LU因子和求解、矩阵算法和线性代数。
- 1月序号:
- Clifford代数矩阵表示的递归表达式。
- Michael Clausen、Ulrich Baum、David K.Maslen、Daniel N.Rockmore:
- 有限群的广义FFT。
uBLAS接口
乔格·沃尔特(Joerg Walter)。
配置
- Stephan Kulow、Walter Tasin、KDevelop团队:
- config.in.in中使用的配置代码
测试
Joerg Walter、John Fletcher、Henk Jansen和Johannes Brunen。
相关项目
约翰·弗莱彻:BoostClifford讨论
权变措施
Carlos O'Ryan:generator.h中使用的解决方法用于:“……只定义了一个私有析构函数,没有朋友”
工具书类
主页