1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
/*1:*/
#line 20 "./gs_tensor.hweb"
#ifndef GS_TENSOR_H
#define GS_TENSOR_H
#include "tensor.h"
#include "fs_tensor.h"
#include "symmetry.h"
#include "rfs_tensor.h"
class FGSTensor;
class UGSTensor;
class FSSparseTensor;
/*2:*/
#line 65 "./gs_tensor.hweb"
class TensorDimens{
protected:
IntSequence nvs;
Symmetry sym;
IntSequence nvmax;
public:
TensorDimens(const Symmetry&s,const IntSequence&nvars)
:nvs(nvars),sym(s),nvmax(sym,nvs){}
TensorDimens(int nvar,int dimen)
:nvs(1),sym(dimen),nvmax(dimen,nvar)
{nvs[0]= nvar;}
TensorDimens(const TensorDimens&td)
:nvs(td.nvs),sym(td.sym),nvmax(td.nvmax){}
virtual~TensorDimens(){}
TensorDimens(const IntSequence&ss,const IntSequence&coor);
const TensorDimens&operator= (const TensorDimens&td)
{nvs= td.nvs;sym= td.sym;nvmax= td.nvmax;return*this;}
bool operator==(const TensorDimens&td)const
{return nvs==td.nvs&&sym==td.sym;}
bool operator!=(const TensorDimens&td)const
{return!operator==(td);}
int dimen()const
{return sym.dimen();}
int getNVX(int i)const
{return nvmax[i];}
const IntSequence&getNVS()const
{return nvs;}
const IntSequence&getNVX()const
{return nvmax;}
const Symmetry&getSym()const
{return sym;}
int calcUnfoldMaxOffset()const;
int calcFoldMaxOffset()const;
int calcFoldOffset(const IntSequence&v)const;
void decrement(IntSequence&v)const;
};
/*:2*/
#line 33 "./gs_tensor.hweb"
;
/*3:*/
#line 118 "./gs_tensor.hweb"
class GSSparseTensor;
class FGSTensor:public FTensor{
friend class UGSTensor;
const TensorDimens tdims;
public:
/*4:*/
#line 149 "./gs_tensor.hweb"
FGSTensor(int r,const TensorDimens&td)
:FTensor(along_col,td.getNVX(),r,
td.calcFoldMaxOffset(),td.dimen()),tdims(td){}
FGSTensor(const FGSTensor&ft)
:FTensor(ft),tdims(ft.tdims){}
FGSTensor(const UGSTensor&ut);
FGSTensor(int first_row,int num,FGSTensor&t)
:FTensor(first_row,num,t),tdims(t.tdims){}
FGSTensor(const FSSparseTensor&t,const IntSequence&ss,
const IntSequence&coor,const TensorDimens&td);
FGSTensor(const FFSTensor&t,const IntSequence&ss,
const IntSequence&coor,const TensorDimens&td);
FGSTensor(const GSSparseTensor&sp);
FGSTensor(FFSTensor&t)
:FTensor(0,t.nrows(),t),tdims(t.nvar(),t.dimen()){}
/*:4*/
#line 125 "./gs_tensor.hweb"
;
virtual~FGSTensor(){}
void increment(IntSequence&v)const;
void decrement(IntSequence&v)const
{tdims.decrement(v);}
UTensor&unfold()const;
const TensorDimens&getDims()const
{return tdims;}
const Symmetry&getSym()const
{return getDims().getSym();}
void contractAndAdd(int i,FGSTensor&out,
const FRSingleTensor&col)const;
int getOffset(const IntSequence&v)const
{return tdims.calcFoldOffset(v);}
};
/*:3*/
#line 34 "./gs_tensor.hweb"
;
/*5:*/
#line 172 "./gs_tensor.hweb"
class UGSTensor:public UTensor{
friend class FGSTensor;
const TensorDimens tdims;
public:
/*6:*/
#line 205 "./gs_tensor.hweb"
UGSTensor(int r,const TensorDimens&td)
:UTensor(along_col,td.getNVX(),r,
td.calcUnfoldMaxOffset(),td.dimen()),tdims(td){}
UGSTensor(const UGSTensor&ut)
:UTensor(ut),tdims(ut.tdims){}
UGSTensor(const FGSTensor&ft);
UGSTensor(int first_row,int num,UGSTensor&t)
:UTensor(first_row,num,t),tdims(t.tdims){}
UGSTensor(const FSSparseTensor&t,const IntSequence&ss,
const IntSequence&coor,const TensorDimens&td);
UGSTensor(const UFSTensor&t,const IntSequence&ss,
const IntSequence&coor,const TensorDimens&td);
UGSTensor(UFSTensor&t)
:UTensor(0,t.nrows(),t),tdims(t.nvar(),t.dimen()){}
/*:6*/
#line 178 "./gs_tensor.hweb"
;
virtual~UGSTensor(){}
void increment(IntSequence&v)const;
void decrement(IntSequence&v)const;
FTensor&fold()const;
const TensorDimens&getDims()const
{return tdims;}
const Symmetry&getSym()const
{return getDims().getSym();}
void contractAndAdd(int i,UGSTensor&out,
const URSingleTensor&col)const;
int getOffset(const IntSequence&v)const;
private:
void unfoldData();
public:
index getFirstIndexOf(const index&in)const;
};
/*:5*/
#line 35 "./gs_tensor.hweb"
;
#endif
/*:1*/
|