tensor: permutation of indices inside a symmetry group

This commit is contained in:
2025-11-18 18:09:04 +01:00
parent 20a61e2fb9
commit 78569ca701
6 changed files with 159 additions and 3 deletions

View File

@@ -142,8 +142,8 @@ switch(I.size()) //a few special cases for efficiency
NRVec<LA_index> II(I);
II.copyonwrite();
if(g.offset!=0) II -= g.offset;
int parity=netsort(II.size(),&II[0]);
*sign= (parity&1) ? g.symmetry : 1;
int nswaps=netsort(II.size(),&II[0]);
*sign= (nswaps&1) ? g.symmetry : 1;
if(g.symmetry == -1) //antisymmetric - do not store zero diagonal
{
for(int i=0; i<I.size()-1; ++i)
@@ -2165,6 +2165,40 @@ apply_permutation_algebra(tmp,pb,true,(T)1,beta);
}
template<typename T>
void Tensor<T>::permute_inside_group(int g, const NRPerm<int> &p, bool inverse)
{
if(g<0||g>=shape.size()) laerror("group out of range");
if(shape[g].symmetry==0) laerror("permutation possible only inside symmetric index groups");
if(shape[g].number!=p.size()) laerror("permutation size mismatch to index number");
if(!p.is_valid()) laerror("invalid permutation in permute_inside_group");
int par=p.parity();
if(par<0)
{
switch(shape[g].symmetry)
{
case 1:
break;
case -1:
data.negateme();
break;
case 2:
data.conjugateme();
break;
case -2:
data.negateconjugateme();
break;
}
}
if(is_named())
{
int ii=0;
for(int i=0; i<g; ++i) ii+= shape[i].number;
NRVec<INDEXNAME> tmp=(names.subvector(ii,ii+p.size()-1)).permuted(p,inverse);
for(int i=0; i<p.size(); ++i) names[ii+i]=tmp[i];
}
}
template class Tensor<double>;