working on tensor class

This commit is contained in:
Jiri Pittner 2024-04-03 22:14:24 +02:00
parent 8bbbaa5bae
commit baee11489b
3 changed files with 26 additions and 7 deletions

13
t.cc
View File

@ -3202,7 +3202,18 @@ g.range=3;
Tensor<double> epsilon(g);
cout <<epsilon.size()<<endl;
//cout <<epsilon(3,2,1)<<endl;
NRVec<LA_index> I({1,2,3});
NRVec<NRVec<LA_index> > II(I,1);
epsilon.lhs(II)=1;
II.copyonwrite();
II[0][0]=3;
II[0][1]=2;
II[0][2]=1;
epsilon *= 2.;
cout <<epsilon(II)<<endl;
}

View File

@ -146,8 +146,16 @@ return r;
}
//@@@@todo flatindex
template<typename T>
LA_largeindex Tensor<T>::index(int *sign, const FLATINDEX &I) const
{
}
//@@@@todo vindex
template<typename T>
LA_largeindex Tensor<T>::vindex(int *sign, int i1, va_list args) const
{
}
template class Tensor<double>;

View File

@ -44,7 +44,7 @@ int sgn;
public:
Signedpointer(T *p, int s) : ptr(p),sgn(s) {};
T& operator=(const T rhs) {if(sgn==0) return *ptr; if(sgn>0) *ptr=rhs; else *ptr = -rhs; return *ptr;}
//@@@@@@operations on singedpointer as LHS of the non-const tensor.operator() expressions
//@@@@@@operations like += etc. on singedpointer as LHS of the non-const tensor.operator() expressions
};
@ -96,16 +96,16 @@ public:
LA_largeindex getsize(); //set redundant data and return total size
LA_largeindex size() const {return data.size();};
void copyonwrite() {shape.copyonwrite(); data.copyonwrite();};
inline Signedpointer<T> operator[](const SUPERINDEX &I) {int sign; LA_largeindex i=index(&sign,I); return Signedpointer<T>(&data[i],sign);};
inline Signedpointer<T> lhs(const SUPERINDEX &I) {int sign; LA_largeindex i=index(&sign,I); return Signedpointer<T>(&data[i],sign);};
inline T operator()(const SUPERINDEX &I) {int sign; LA_largeindex i=index(&sign,I); if(sign==0) return 0; return sign>0 ?data[i] : -data[i];};
inline Signedpointer<T> operator[](const FLATINDEX &I) {int sign; LA_largeindex i=index(&sign,I); return Signedpointer<T>(&data[i],sign);};
inline Signedpointer<T> lhs(const FLATINDEX &I) {int sign; LA_largeindex i=index(&sign,I); return Signedpointer<T>(&data[i],sign);};
inline T operator()(const FLATINDEX &I) {int sign; LA_largeindex i=index(&sign,I); if(sign==0) return 0; return sign>0 ?data[i] : -data[i];};
//inline Signedpointer<T> operator[](int i1...) {va_list args; int sign; LA_largeindex i; va_start(args,i1); i= vindex(&sign, i1,args); return Signedpointer<T>(&data[i],sign); };
//cannot have operator[] with variable number of argmuments
inline Signedpointer<T> lhs(int i1...) {va_list args; int sign; LA_largeindex i; va_start(args,i1); i= vindex(&sign, i1,args); return Signedpointer<T>(&data[i],sign); };
inline T operator()(int i1...) {va_list args; ; int sign; LA_largeindex i; va_start(args,i1); i= vindex(&sign, i1,args); if(sign==0) return 0; return sign>0 ?data[i] : -data[i];};
//@@@do a 'set' operatiaon with va_arg instead
//NOTE: for sign==0 data[i] can be undefined pointer, avoid dereferencing it
inline Tensor& operator*=(const T &a) {data*=a; return *this;};
//@@@TODO - unwinding to full size in a specified index
//@@@TODO - contractions - basic and efficient