tensor: optional distinguishing of covariant and contravariant indices for contractions
This commit is contained in:
parent
3baced9adb
commit
4bd2761cc5
33
tensor.cc
33
tensor.cc
@ -326,6 +326,9 @@ shape[0].symmetry=0;
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
shape[0].offset=0;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
shape[0].upperindex=false;
|
||||
#endif
|
||||
shape[0].range=x.size();
|
||||
calcsize();
|
||||
}
|
||||
@ -342,6 +345,9 @@ if(x.nrows()==x.ncols() && !flat)
|
||||
shape[0].symmetry=0;
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
shape[0].offset=0;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
shape[0].upperindex=false;
|
||||
#endif
|
||||
shape[0].range=x.nrows();
|
||||
}
|
||||
@ -352,6 +358,9 @@ else
|
||||
shape[0].symmetry=0; shape[1].symmetry=0;
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
shape[0].offset=0; shape[1].offset=0;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
shape[0].upperindex=false;
|
||||
#endif
|
||||
shape[0].range=x.ncols();
|
||||
shape[1].range=x.nrows();
|
||||
@ -371,6 +380,9 @@ shape[0].symmetry=1;
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
shape[0].offset=0;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
shape[0].upperindex=false;
|
||||
#endif
|
||||
shape[0].range=x.nrows();
|
||||
calcsize();
|
||||
}
|
||||
@ -524,6 +536,9 @@ s<<x.number <<" "<<x.symmetry<<" ";
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
s<<x.offset<<" ";
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
s<<x.upperindex<<" ";
|
||||
#endif
|
||||
s<< x.range<<std::endl;
|
||||
return s;
|
||||
}
|
||||
@ -534,6 +549,9 @@ s>>x.number>>x.symmetry;
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
s>>x.offset;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
s>> x.upperindex;
|
||||
#endif
|
||||
s>>x.range;
|
||||
return s;
|
||||
}
|
||||
@ -724,6 +742,9 @@ newshape[0].range=shape[group].range;
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
newshape[0].offset = shape[group].offset;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
newshape[0].upperindex = shape[group].upperindex;
|
||||
#endif
|
||||
int flatindex=0; //(group,index) in flat form
|
||||
for(int i=0; i<shape.size(); ++i)
|
||||
{
|
||||
@ -819,6 +840,9 @@ for(int g=0; g<shape.size(); ++g)
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
newshape[gg].offset = shape[g].offset;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
newshape[gg].upperindex = shape[g].upperindex;
|
||||
#endif
|
||||
gg++;
|
||||
}
|
||||
}
|
||||
@ -897,6 +921,9 @@ for(int i=0; i<il.size(); ++i)
|
||||
newshape[i].range=shape[il[i].group].range;
|
||||
#ifndef LA_TENSOR_ZERO_OFFSET
|
||||
newshape[i].offset = shape[il[i].group].offset;
|
||||
#endif
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
newshape[i].upperindex = shape[il[i].group].upperindex;
|
||||
#endif
|
||||
oldshape[il[i].group].number --;
|
||||
}
|
||||
@ -998,6 +1025,9 @@ if(index<0||index>=rhs1.shape[group].number) laerror("wrong index number in con
|
||||
if(rhsindex<0||rhsindex>=rhs.shape[rhsgroup].number) laerror("wrong index number in conntraction");
|
||||
if(rhs1.shape[group].offset != rhs.shape[rhsgroup].offset) laerror("incompatible index offset in contraction");
|
||||
if(rhs1.shape[group].range != rhs.shape[rhsgroup].range) laerror("incompatible index range in contraction");
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
if(rhs1.shape[group].upperindex ^ rhs.shape[rhsgroup].upperindex == false) laerror("can contact only upper with lower index");
|
||||
#endif
|
||||
|
||||
const Tensor<T> u = conjugate1? (rhs1.unwind_index(group,index)).conjugate() : rhs1.unwind_index(group,index);
|
||||
const Tensor<T> rhsu = rhs.unwind_index(rhsgroup,rhsindex);
|
||||
@ -1040,6 +1070,9 @@ for(int i=0; i<il1.size(); ++i)
|
||||
if(il2[i].index<0||il2[i].index>=rhs2.shape[il2[i].group].number) laerror("wrong index2 number in conntractions");
|
||||
if(rhs1.shape[il1[i].group].offset != rhs2.shape[il2[i].group].offset) laerror("incompatible index offset in contractions");
|
||||
if(rhs1.shape[il1[i].group].range != rhs2.shape[il2[i].group].range) laerror("incompatible index range in contractions");
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
if(rhs1.shape[il1[i].group].upperindex ^ rhs2.shape[il2[i].group].upperindex == false) laerror("can contact only upper with lower index");
|
||||
#endif
|
||||
}
|
||||
|
||||
Tensor<T> u = rhs1.unwind_indices(il1);
|
||||
|
||||
16
tensor.h
16
tensor.h
@ -46,13 +46,16 @@
|
||||
//@@@ will need to store vector of INDEX to the original tensor for the result's flatindex
|
||||
//@@@ will not be particularly efficient
|
||||
//
|
||||
//@@@conversions to/from fourindex, optional negarive rande for beta spin handling
|
||||
//@@@ optional distinguish covariant and contravariant check in contraction
|
||||
//@@@conversions to/from fourindex, optional negarive range for beta spin handling
|
||||
//
|
||||
//@@@?general permutation of individual indices - check the indices in sym groups remain adjacent, calculate result's shape, loopover the result and permute using unwind_callback
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
//do not distinguish covariant/contravariant indices
|
||||
#undef LA_TENSOR_INDEXPOSITION
|
||||
|
||||
namespace LA {
|
||||
|
||||
|
||||
@ -91,8 +94,15 @@ static const LA_index offset = 0; //compiler can optimize away some computations
|
||||
LA_index offset; //indices start at a general offset
|
||||
#endif
|
||||
LA_index range; //indices span this range
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
bool upperindex;
|
||||
#endif
|
||||
|
||||
bool operator==(const indexgroup &rhs) const {return number==rhs.number && symmetry==rhs.symmetry && offset==rhs.offset && range==rhs.range;};
|
||||
bool operator==(const indexgroup &rhs) const {return number==rhs.number && symmetry==rhs.symmetry && offset==rhs.offset && range==rhs.range
|
||||
#ifdef LA_TENSOR_INDEXPOSITION
|
||||
&& upperindex == rhs.upperindex
|
||||
#endif
|
||||
;};
|
||||
inline bool operator!=(const indexgroup &rhs) const {return !((*this)==rhs);};
|
||||
} INDEXGROUP;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user