[add] dim: add basis, tensor: add optimize transposition
This commit is contained in:
+18
-12
@@ -38,7 +38,7 @@ TEST(size){
|
|||||||
D->shape[2]=5;
|
D->shape[2]=5;
|
||||||
D->shape[3]=6;
|
D->shape[3]=6;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
EXPECT_EQ(D->size, 180);
|
EXPECT_EQ(D->size, 180);
|
||||||
|
|
||||||
free_dimension(D);
|
free_dimension(D);
|
||||||
@@ -50,7 +50,7 @@ TEST(SplitDim){
|
|||||||
D->shape[2]=5;
|
D->shape[2]=5;
|
||||||
D->shape[3]=6;
|
D->shape[3]=6;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
printDebug_dimension(D," D root");
|
printDebug_dimension(D," D root");
|
||||||
|
|
||||||
dimension *d_part1 = NULL,*d_part2=NULL;
|
dimension *d_part1 = NULL,*d_part2=NULL;
|
||||||
@@ -80,7 +80,7 @@ TEST(SplitDim_2){
|
|||||||
D->shape[2]=5;
|
D->shape[2]=5;
|
||||||
D->shape[3]=6;
|
D->shape[3]=6;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
printDebug_dimension(D," D root");
|
printDebug_dimension(D," D root");
|
||||||
|
|
||||||
dimension *d_part1 = NULL,*d_part2=NULL;
|
dimension *d_part1 = NULL,*d_part2=NULL;
|
||||||
@@ -122,8 +122,10 @@ TEST(SubDimB){
|
|||||||
EXPECT_EQ(d_tail2->size, 15*26);
|
EXPECT_EQ(d_tail2->size, 15*26);
|
||||||
|
|
||||||
free_dimension(D);
|
free_dimension(D);
|
||||||
free(d_tail2);
|
d_tail2->shape=NULL;
|
||||||
free(d_head2);
|
d_head2->shape=NULL;
|
||||||
|
free_dimension(d_tail2);
|
||||||
|
free_dimension(d_head2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SubDim){
|
TEST(SubDim){
|
||||||
@@ -143,8 +145,12 @@ TEST(SubDim){
|
|||||||
EXPECT_EQ(d_tail2->size, 5*6);
|
EXPECT_EQ(d_tail2->size, 5*6);
|
||||||
|
|
||||||
free_dimension(D);
|
free_dimension(D);
|
||||||
free(d_tail2);
|
d_tail2->shape=NULL;
|
||||||
free(d_head2);
|
d_head2->shape=NULL;
|
||||||
|
free_dimension(d_tail2);
|
||||||
|
free_dimension(d_head2);
|
||||||
|
//free(d_tail2);
|
||||||
|
//free(d_head2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Coord_linear){
|
TEST(Coord_linear){
|
||||||
@@ -154,7 +160,7 @@ TEST(Coord_linear){
|
|||||||
D->shape[2]=5;
|
D->shape[2]=5;
|
||||||
D->shape[3]=6;
|
D->shape[3]=6;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
|
|
||||||
size_t line=255;
|
size_t line=255;
|
||||||
size_t *coord = CoordFromLin(line,D);
|
size_t *coord = CoordFromLin(line,D);
|
||||||
@@ -175,7 +181,7 @@ TEST(signedCoord_linear){
|
|||||||
D->shape[2]=5;
|
D->shape[2]=5;
|
||||||
D->shape[3]=6;
|
D->shape[3]=6;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
|
|
||||||
long line=-255;
|
long line=-255;
|
||||||
long *coord = signedCoordFromLin(line,D);
|
long *coord = signedCoordFromLin(line,D);
|
||||||
@@ -195,7 +201,7 @@ TEST(signedCoord_linearSuccessif){
|
|||||||
D->shape[1]=3;
|
D->shape[1]=3;
|
||||||
D->shape[2]=2;
|
D->shape[2]=2;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
|
|
||||||
for(long line=-4; line < 4; ++line){
|
for(long line=-4; line < 4; ++line){
|
||||||
long *coord = signedCoordFromLin(line,D);
|
long *coord = signedCoordFromLin(line,D);
|
||||||
@@ -217,7 +223,7 @@ TEST(sprint_dim){
|
|||||||
D->shape[2]=5;
|
D->shape[2]=5;
|
||||||
D->shape[3]=6;
|
D->shape[3]=6;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
|
|
||||||
char *dimSTR =NULL;
|
char *dimSTR =NULL;
|
||||||
size_t nb=sprint_dimension(&dimSTR, D);
|
size_t nb=sprint_dimension(&dimSTR, D);
|
||||||
@@ -236,7 +242,7 @@ TEST(incrment_dim){
|
|||||||
D->shape[2]=5;
|
D->shape[2]=5;
|
||||||
D->shape[3]=6;
|
D->shape[3]=6;
|
||||||
|
|
||||||
updateRankDim(D);
|
updateDim(D);
|
||||||
|
|
||||||
char *dimSTR =NULL;
|
char *dimSTR =NULL;
|
||||||
size_t nb=sprint_dimension(&dimSTR, D);
|
size_t nb=sprint_dimension(&dimSTR, D);
|
||||||
|
|||||||
+102
-55
@@ -275,9 +275,11 @@ long diff_timespec_nanoseconds(struct timespec time_stop, struct timespec time_s
|
|||||||
#include "../list_t/list_t.h"
|
#include "../list_t/list_t.h"
|
||||||
|
|
||||||
struct dimension{
|
struct dimension{
|
||||||
size_t size;
|
|
||||||
size_t *shape;
|
|
||||||
size_t rank;
|
size_t rank;
|
||||||
|
size_t *shape;
|
||||||
|
long int *basis;
|
||||||
|
size_t basis_rank;
|
||||||
|
size_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -324,7 +326,7 @@ void min_dimension(dimension **d, dimension *d0, dimension *d1);
|
|||||||
void printDebug_dimension(dimension *d, char *msg);
|
void printDebug_dimension(dimension *d, char *msg);
|
||||||
size_t sprint_dimension(char **dimContent, dimension *d);
|
size_t sprint_dimension(char **dimContent, dimension *d);
|
||||||
|
|
||||||
void updateRankDim(dimension *dim);
|
void updateDim(dimension *dim);
|
||||||
|
|
||||||
size_t LineFromCoord(size_t *coo, dimension *dim);
|
size_t LineFromCoord(size_t *coo, dimension *dim);
|
||||||
size_t* CoordFromLin(size_t line, dimension *dim);
|
size_t* CoordFromLin(size_t line, dimension *dim);
|
||||||
@@ -384,7 +386,9 @@ dimension* init_dim(size_t *t, size_t rnk){\
|
|||||||
dimension *d = malloc(sizeof(dimension));\
|
dimension *d = malloc(sizeof(dimension));\
|
||||||
d->rank=rnk;\
|
d->rank=rnk;\
|
||||||
d->shape=t;\
|
d->shape=t;\
|
||||||
updateRankDim(d);\
|
d->basis=NULL;\
|
||||||
|
d->basis_rank=0;\
|
||||||
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
@@ -392,9 +396,11 @@ dimension* init_copy_dim(size_t *t, size_t rnk){\
|
|||||||
if (rnk==0) return NULL;\
|
if (rnk==0) return NULL;\
|
||||||
dimension *d = malloc(sizeof(dimension));\
|
dimension *d = malloc(sizeof(dimension));\
|
||||||
d->shape=malloc(rnk * sizeof(size_t));\
|
d->shape=malloc(rnk * sizeof(size_t));\
|
||||||
|
d->basis=NULL;\
|
||||||
|
d->basis_rank=0;\
|
||||||
d->rank = rnk;\
|
d->rank = rnk;\
|
||||||
for(size_t i=0; i<rnk; ++i) d->shape[i]=t[i];\
|
for(size_t i=0; i<rnk; ++i) d->shape[i]=t[i];\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
dimension *\
|
dimension *\
|
||||||
@@ -402,6 +408,8 @@ create_dim(size_t rnk){\
|
|||||||
if (rnk==0) return NULL;\
|
if (rnk==0) return NULL;\
|
||||||
dimension *d = malloc(sizeof(dimension));\
|
dimension *d = malloc(sizeof(dimension));\
|
||||||
d->shape=malloc(rnk * sizeof(size_t));\
|
d->shape=malloc(rnk * sizeof(size_t));\
|
||||||
|
d->basis=NULL;\
|
||||||
|
d->basis_rank=0;\
|
||||||
d->rank = rnk;\
|
d->rank = rnk;\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
@@ -414,13 +422,14 @@ dimension *\
|
|||||||
create_reverse_dim(size_t rnk){\
|
create_reverse_dim(size_t rnk){\
|
||||||
dimension *dim = create_dim(rnk);\
|
dimension *dim = create_dim(rnk);\
|
||||||
for(size_t i=0;i<rnk;++i) dim->shape[i]=rnk-1-i;\
|
for(size_t i=0;i<rnk;++i) dim->shape[i]=rnk-1-i;\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
return dim;\
|
return dim;\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
void free_dimension(dimension *d){\
|
void free_dimension(dimension *d){\
|
||||||
if(d){\
|
if(d){\
|
||||||
free(d->shape);\
|
if(d->shape) free(d->shape);\
|
||||||
|
if(d->basis) free(d->basis);\
|
||||||
free(d);\
|
free(d);\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
@@ -437,7 +446,7 @@ bool is_equal_dim(dimension *d0, dimension *d1){\
|
|||||||
dimension* sub_copy_minus_dim_head(dimension *root, size_t minusSubdim){\
|
dimension* sub_copy_minus_dim_head(dimension *root, size_t minusSubdim){\
|
||||||
if(minusSubdim < (root->rank)){\
|
if(minusSubdim < (root->rank)){\
|
||||||
dimension *d = init_copy_dim(root->shape, (root->rank)-minusSubdim);\
|
dimension *d = init_copy_dim(root->shape, (root->rank)-minusSubdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -446,7 +455,7 @@ dimension* sub_copy_minus_dim_head(dimension *root, size_t minusSubdim){\
|
|||||||
dimension* sub_copy_minus_dim_tail(dimension *root, size_t minusSubdim){\
|
dimension* sub_copy_minus_dim_tail(dimension *root, size_t minusSubdim){\
|
||||||
if(minusSubdim < (root->rank)){\
|
if(minusSubdim < (root->rank)){\
|
||||||
dimension *d = init_copy_dim((root->shape)+minusSubdim, (root->rank)-minusSubdim);\
|
dimension *d = init_copy_dim((root->shape)+minusSubdim, (root->rank)-minusSubdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -455,7 +464,7 @@ dimension* sub_copy_minus_dim_tail(dimension *root, size_t minusSubdim){\
|
|||||||
dimension* sub_copy_dim_head(dimension *root, size_t subdim){\
|
dimension* sub_copy_dim_head(dimension *root, size_t subdim){\
|
||||||
if(subdim < (root->rank)){\
|
if(subdim < (root->rank)){\
|
||||||
dimension *d = init_copy_dim(root->shape, subdim);\
|
dimension *d = init_copy_dim(root->shape, subdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -464,7 +473,7 @@ dimension* sub_copy_dim_head(dimension *root, size_t subdim){\
|
|||||||
dimension* sub_copy_dim_tail(dimension *root, size_t subdim){\
|
dimension* sub_copy_dim_tail(dimension *root, size_t subdim){\
|
||||||
if(subdim < (root->rank)){\
|
if(subdim < (root->rank)){\
|
||||||
dimension *d = init_copy_dim((root->shape)+(root->rank - subdim), subdim);\
|
dimension *d = init_copy_dim((root->shape)+(root->rank - subdim), subdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -474,7 +483,7 @@ void add_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
|||||||
(*d) = create_dim(d0->rank + d1->rank);\
|
(*d) = create_dim(d0->rank + d1->rank);\
|
||||||
for (size_t i = 0; i < d0->rank; i++) (*d)->shape[i] = d0->shape[i];\
|
for (size_t i = 0; i < d0->rank; i++) (*d)->shape[i] = d0->shape[i];\
|
||||||
for (size_t i = 0; i < d1->rank; i++) (*d)->shape[d0->rank + i] = d1->shape[i];\
|
for (size_t i = 0; i < d1->rank; i++) (*d)->shape[d0->rank + i] = d1->shape[i];\
|
||||||
updateRankDim(*d);\
|
updateDim(*d);\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
void min_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
void min_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
||||||
@@ -485,7 +494,7 @@ void min_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
|||||||
if (d0->shape[i] > d1->shape[i]) (*d)->shape[i] = d1->shape[i];\
|
if (d0->shape[i] > d1->shape[i]) (*d)->shape[i] = d1->shape[i];\
|
||||||
else (*d)->shape[i] = d0->shape[i];\
|
else (*d)->shape[i] = d0->shape[i];\
|
||||||
}\
|
}\
|
||||||
updateRankDim(*d);\
|
updateDim(*d);\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
\
|
\
|
||||||
@@ -494,7 +503,7 @@ void min_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
|||||||
dimension* sub_minus_dim_head(dimension *root, size_t minusSubdim){\
|
dimension* sub_minus_dim_head(dimension *root, size_t minusSubdim){\
|
||||||
if(minusSubdim < (root->rank)){\
|
if(minusSubdim < (root->rank)){\
|
||||||
dimension *d = init_dim(root->shape, (root->rank)-minusSubdim);\
|
dimension *d = init_dim(root->shape, (root->rank)-minusSubdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -502,7 +511,7 @@ dimension* sub_minus_dim_head(dimension *root, size_t minusSubdim){\
|
|||||||
dimension* sub_minus_dim_tail(dimension *root, size_t minusSubdim){\
|
dimension* sub_minus_dim_tail(dimension *root, size_t minusSubdim){\
|
||||||
if(minusSubdim < (root->rank)){\
|
if(minusSubdim < (root->rank)){\
|
||||||
dimension *d = init_dim((root->shape)+minusSubdim, (root->rank)-minusSubdim);\
|
dimension *d = init_dim((root->shape)+minusSubdim, (root->rank)-minusSubdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -510,7 +519,7 @@ dimension* sub_minus_dim_tail(dimension *root, size_t minusSubdim){\
|
|||||||
dimension* sub_dim_head(dimension *root, size_t subdim){\
|
dimension* sub_dim_head(dimension *root, size_t subdim){\
|
||||||
if(subdim < (root->rank)){\
|
if(subdim < (root->rank)){\
|
||||||
dimension *d = init_dim(root->shape, subdim);\
|
dimension *d = init_dim(root->shape, subdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -518,7 +527,7 @@ dimension* sub_dim_head(dimension *root, size_t subdim){\
|
|||||||
dimension* sub_dim_tail(dimension *root, size_t subdim){\
|
dimension* sub_dim_tail(dimension *root, size_t subdim){\
|
||||||
if(subdim < (root->rank)){\
|
if(subdim < (root->rank)){\
|
||||||
dimension *d = init_dim((root->shape)+(root->rank - subdim), subdim);\
|
dimension *d = init_dim((root->shape)+(root->rank - subdim), subdim);\
|
||||||
updateRankDim(d);\
|
updateDim(d);\
|
||||||
return d;\
|
return d;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -533,14 +542,14 @@ void split_dim_part(dimension *root, dimension **part_1, dimension **part_2, siz
|
|||||||
/*printf("rnk_part1 :%ld \n",rnk_part1);*/\
|
/*printf("rnk_part1 :%ld \n",rnk_part1);*/\
|
||||||
*part_1 = init_copy_dim(root->shape, root->rank);\
|
*part_1 = init_copy_dim(root->shape, root->rank);\
|
||||||
((*part_1)->shape[pivotSplit]) -= rangeInPivot;\
|
((*part_1)->shape[pivotSplit]) -= rangeInPivot;\
|
||||||
updateRankDim(*part_1);\
|
updateDim(*part_1);\
|
||||||
/*if(rnk_nb_minus_part <2)\
|
/*if(rnk_nb_minus_part <2)\
|
||||||
*part_2 = init_copy_dim((root->shape), root->rank-1 );\
|
*part_2 = init_copy_dim((root->shape), root->rank-1 );\
|
||||||
else{*/\
|
else{*/\
|
||||||
*part_2 = init_copy_dim((root->shape), root->rank );\
|
*part_2 = init_copy_dim((root->shape), root->rank );\
|
||||||
(*part_2)->shape[pivotSplit] = rangeInPivot ;\
|
(*part_2)->shape[pivotSplit] = rangeInPivot ;\
|
||||||
/*}*/\
|
/*}*/\
|
||||||
updateRankDim(*part_2);\
|
updateDim(*part_2);\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
@@ -568,7 +577,7 @@ void add_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
|||||||
(*d) = create_dim(d0->rank + d1->rank);\
|
(*d) = create_dim(d0->rank + d1->rank);\
|
||||||
for (size_t i = 0; i < d0->rank; i++) (*d)->shape[i] = d0->shape[i];\
|
for (size_t i = 0; i < d0->rank; i++) (*d)->shape[i] = d0->shape[i];\
|
||||||
for (size_t i = 0; i < d1->rank; i++) (*d)->shape[d0->rank + i] = d1->shape[i];\
|
for (size_t i = 0; i < d1->rank; i++) (*d)->shape[d0->rank + i] = d1->shape[i];\
|
||||||
updateRankDim(*d);\
|
updateDim(*d);\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
void min_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
void min_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
||||||
@@ -584,7 +593,7 @@ void min_dimension(dimension **d, dimension *d0, dimension *d1) {\
|
|||||||
if (d0->shape[i] > d1->shape[i]) (*d)->shape[i] = d1->shape[i];\
|
if (d0->shape[i] > d1->shape[i]) (*d)->shape[i] = d1->shape[i];\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
updateRankDim(*d);\
|
updateDim(*d);\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
void printDebug_dimension(dimension *d,char *msg){\
|
void printDebug_dimension(dimension *d,char *msg){\
|
||||||
@@ -650,10 +659,21 @@ size_t sprint_dimension(char **dimContent, dimension *d){\
|
|||||||
return cur;\
|
return cur;\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
void updateRankDim(dimension *dim){\
|
void updateDim(dimension *dim){\
|
||||||
dim->size=1;\
|
if(dim->basis==NULL){\
|
||||||
for(size_t i=0; i<dim->rank; ++i)\
|
\
|
||||||
dim->size *=dim->shape[i];\
|
dim->basis_rank=dim->rank+1;\
|
||||||
|
dim->basis=malloc(dim->basis_rank *sizeof(long int));\
|
||||||
|
}else if(dim->basis_rank != dim->rank+1){\
|
||||||
|
free(dim->basis);\
|
||||||
|
dim->basis_rank=dim->rank+1;\
|
||||||
|
dim->basis=malloc(dim->basis_rank *sizeof(long int));\
|
||||||
|
}\
|
||||||
|
dim->basis[dim->rank]=1;\
|
||||||
|
for(long int j=dim->rank-1; j>=0; --j){\
|
||||||
|
dim->basis[j] = dim->basis[j+1]*dim->shape[j];\
|
||||||
|
}\
|
||||||
|
dim->size=dim->basis[0];\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
/* signed */\
|
/* signed */\
|
||||||
@@ -754,7 +774,7 @@ dimension * create_dim_from_list_shape( list_shape_in_dim *l_p){\
|
|||||||
(dim)->shape[tmp->index]=tmp->shape;\
|
(dim)->shape[tmp->index]=tmp->shape;\
|
||||||
tmp=tmp->next;\
|
tmp=tmp->next;\
|
||||||
}\
|
}\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
return dim;\
|
return dim;\
|
||||||
}\
|
}\
|
||||||
return NULL;\
|
return NULL;\
|
||||||
@@ -764,7 +784,7 @@ dimension * create_binary_dim(size_t dimension_rank){\
|
|||||||
dimension * dim = create_dim(dimension_rank);\
|
dimension * dim = create_dim(dimension_rank);\
|
||||||
for(size_t i=0; i<dimension_rank; ++i)\
|
for(size_t i=0; i<dimension_rank; ++i)\
|
||||||
dim->shape[i]=2;\
|
dim->shape[i]=2;\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
return dim;\
|
return dim;\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
@@ -955,7 +975,7 @@ long int decr(long int i) { return i - 1; }
|
|||||||
#define GEN_FUNC_TENSOR(type)\
|
#define GEN_FUNC_TENSOR(type)\
|
||||||
tensor_##type* create_tensor_##type(dimension *dim){\
|
tensor_##type* create_tensor_##type(dimension *dim){\
|
||||||
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
r_tens->dim = dim;\
|
r_tens->dim = dim;\
|
||||||
r_tens->x = malloc(sizeof(type)*dim->size);\
|
r_tens->x = malloc(sizeof(type)*dim->size);\
|
||||||
return r_tens;\
|
return r_tens;\
|
||||||
@@ -973,7 +993,7 @@ void _recreate_tensor_if_not_the_same_dim_or_null_##type(tensor_##type **M, dime
|
|||||||
}\
|
}\
|
||||||
tensor_##type* init_tensor_head_##type(tensor_##type *troot ,dimension *dim){\
|
tensor_##type* init_tensor_head_##type(tensor_##type *troot ,dimension *dim){\
|
||||||
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
r_tens->dim = dim;\
|
r_tens->dim = dim;\
|
||||||
r_tens->x = troot->x;\
|
r_tens->x = troot->x;\
|
||||||
return r_tens;\
|
return r_tens;\
|
||||||
@@ -981,7 +1001,7 @@ tensor_##type* init_tensor_head_##type(tensor_##type *troot ,dimension *dim){\
|
|||||||
\
|
\
|
||||||
tensor_##type* init_tensor_tail_##type(tensor_##type *troot ,dimension *dim){\
|
tensor_##type* init_tensor_tail_##type(tensor_##type *troot ,dimension *dim){\
|
||||||
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
r_tens->dim = dim;\
|
r_tens->dim = dim;\
|
||||||
r_tens->x = troot->x + ((troot->dim)->size - dim->size);\
|
r_tens->x = troot->x + ((troot->dim)->size - dim->size);\
|
||||||
return r_tens;\
|
return r_tens;\
|
||||||
@@ -990,7 +1010,7 @@ tensor_##type* init_tensor_head_##type(tensor_##type *troot ,dimension *dim){\
|
|||||||
\
|
\
|
||||||
tensor_##type* init_copy_tensor_head_##type(tensor_##type *troot ,dimension *dim){\
|
tensor_##type* init_copy_tensor_head_##type(tensor_##type *troot ,dimension *dim){\
|
||||||
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
r_tens->dim = dim;\
|
r_tens->dim = dim;\
|
||||||
/*r_tens->x = troot->x;*/\
|
/*r_tens->x = troot->x;*/\
|
||||||
for(size_t i=0; i<dim->size;++i)\
|
for(size_t i=0; i<dim->size;++i)\
|
||||||
@@ -1000,7 +1020,7 @@ tensor_##type* init_copy_tensor_head_##type(tensor_##type *troot ,dimension *dim
|
|||||||
\
|
\
|
||||||
tensor_##type* init_copy_tensor_tail_##type(tensor_##type *troot ,dimension *dim){\
|
tensor_##type* init_copy_tensor_tail_##type(tensor_##type *troot ,dimension *dim){\
|
||||||
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
tensor_##type *r_tens=malloc(sizeof(tensor_##type));\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
r_tens->dim = dim;\
|
r_tens->dim = dim;\
|
||||||
/*r_tens->x = troot->x + ((troot->dim)->size - dim->size);*/\
|
/*r_tens->x = troot->x + ((troot->dim)->size - dim->size);*/\
|
||||||
r_tens->x = malloc(sizeof(type)*dim->size);\
|
r_tens->x = malloc(sizeof(type)*dim->size);\
|
||||||
@@ -1589,7 +1609,7 @@ void tensorContractnProd_##type(tensor_##type** MM, tensor_##type *M0, tensor_##
|
|||||||
dimension *dd;\
|
dimension *dd;\
|
||||||
add_dimension(&dd, dSub0, dSub1);\
|
add_dimension(&dd, dSub0, dSub1);\
|
||||||
/*printDebug_dimension(dd,"dd");*/\
|
/*printDebug_dimension(dd,"dd");*/\
|
||||||
updateRankDim(dd);\
|
updateDim(dd);\
|
||||||
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
||||||
tensor_##type *M= *MM;\
|
tensor_##type *M= *MM;\
|
||||||
\
|
\
|
||||||
@@ -1667,7 +1687,7 @@ void tensorContractnProdOpt0_##type(tensor_##type** MM, tensor_##type *M0, tenso
|
|||||||
dimension *dd;\
|
dimension *dd;\
|
||||||
add_dimension(&dd, dSub0, dSub1);\
|
add_dimension(&dd, dSub0, dSub1);\
|
||||||
/*printDebug_dimension(dd,"dd");*/\
|
/*printDebug_dimension(dd,"dd");*/\
|
||||||
updateRankDim(dd);\
|
updateDim(dd);\
|
||||||
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
||||||
tensor_##type *M= *MM;\
|
tensor_##type *M= *MM;\
|
||||||
\
|
\
|
||||||
@@ -1899,7 +1919,7 @@ void tensorContractnProdThread_##type(tensor_##type** MM, tensor_##type *M0, ten
|
|||||||
\
|
\
|
||||||
dimension *dd;\
|
dimension *dd;\
|
||||||
add_dimension(&dd, dSub0, dSub1);\
|
add_dimension(&dd, dSub0, dSub1);\
|
||||||
updateRankDim(dd);\
|
updateDim(dd);\
|
||||||
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
||||||
tensor_##type *M= *MM;\
|
tensor_##type *M= *MM;\
|
||||||
\
|
\
|
||||||
@@ -1996,7 +2016,7 @@ void tensorContractnProdThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0,
|
|||||||
\
|
\
|
||||||
dimension *dd;\
|
dimension *dd;\
|
||||||
add_dimension(&dd, dSub0, dSub1);\
|
add_dimension(&dd, dSub0, dSub1);\
|
||||||
updateRankDim(dd);\
|
updateDim(dd);\
|
||||||
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
||||||
tensor_##type *M= *MM;\
|
tensor_##type *M= *MM;\
|
||||||
\
|
\
|
||||||
@@ -2104,7 +2124,7 @@ void tensorContractnPro2dThread_##type(tensor_##type** MM, tensor_##type *M0, te
|
|||||||
\
|
\
|
||||||
dimension *dd;\
|
dimension *dd;\
|
||||||
add_dimension(&dd, dSub0, dSub1);\
|
add_dimension(&dd, dSub0, dSub1);\
|
||||||
updateRankDim(dd);\
|
updateDim(dd);\
|
||||||
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
||||||
tensor_##type *M= *MM;\
|
tensor_##type *M= *MM;\
|
||||||
\
|
\
|
||||||
@@ -2204,7 +2224,7 @@ void tensorContractnPro2dThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0
|
|||||||
\
|
\
|
||||||
dimension *dd;\
|
dimension *dd;\
|
||||||
add_dimension(&dd, dSub0, dSub1);\
|
add_dimension(&dd, dSub0, dSub1);\
|
||||||
updateRankDim(dd);\
|
updateDim(dd);\
|
||||||
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
||||||
tensor_##type *M= *MM;\
|
tensor_##type *M= *MM;\
|
||||||
\
|
\
|
||||||
@@ -2272,7 +2292,7 @@ void tensorContractnProdNotOpt_##type(tensor_##type** MM, tensor_##type *M0, ten
|
|||||||
dimension *dd;\
|
dimension *dd;\
|
||||||
add_dimension(&dd, dSub0, dSub1);\
|
add_dimension(&dd, dSub0, dSub1);\
|
||||||
/*printDebug_dimension(dd,"dd");*/\
|
/*printDebug_dimension(dd,"dd");*/\
|
||||||
updateRankDim(dd);\
|
updateDim(dd);\
|
||||||
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
_recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\
|
||||||
tensor_##type *M= *MM;\
|
tensor_##type *M= *MM;\
|
||||||
\
|
\
|
||||||
@@ -2462,10 +2482,10 @@ void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_#
|
|||||||
dim2->shape[0] = dim->shape[0];\
|
dim2->shape[0] = dim->shape[0];\
|
||||||
for(size_t i=1;i<dim2->rank;++i) dim2->shape[i] = ddim2->shape[i-1];\
|
for(size_t i=1;i<dim2->rank;++i) dim2->shape[i] = ddim2->shape[i-1];\
|
||||||
/*dim2->shape[1] = dim->shape[dim->rank - 1];*/\
|
/*dim2->shape[1] = dim->shape[dim->rank - 1];*/\
|
||||||
updateRankDim(dim1);\
|
updateDim(dim1);\
|
||||||
updateRankDim(ddim1);\
|
updateDim(ddim1);\
|
||||||
updateRankDim(ddim2);\
|
updateDim(ddim2);\
|
||||||
updateRankDim(dim2);\
|
updateDim(dim2);\
|
||||||
*Tpart1 = create_tensor_##type(dim1);\
|
*Tpart1 = create_tensor_##type(dim1);\
|
||||||
*Tpart2 = create_tensor_##type(dim2);\
|
*Tpart2 = create_tensor_##type(dim2);\
|
||||||
\
|
\
|
||||||
@@ -2517,8 +2537,8 @@ void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_#
|
|||||||
dimension *ddim2 = create_dim(pivotSplit);\
|
dimension *ddim2 = create_dim(pivotSplit);\
|
||||||
for(size_t i=0;i<ddim1->rank;++i) ddim1->shape[i] = dim->shape[i];\
|
for(size_t i=0;i<ddim1->rank;++i) ddim1->shape[i] = dim->shape[i];\
|
||||||
for(size_t i=0;i<ddim2->rank;++i) ddim2->shape[i] = dim->shape[dim->rank - pivotSplit + i];\
|
for(size_t i=0;i<ddim2->rank;++i) ddim2->shape[i] = dim->shape[dim->rank - pivotSplit + i];\
|
||||||
updateRankDim(ddim1);\
|
updateDim(ddim1);\
|
||||||
updateRankDim(ddim2);\
|
updateDim(ddim2);\
|
||||||
array_chainlist_##type *l_a1=NULL;\
|
array_chainlist_##type *l_a1=NULL;\
|
||||||
array_chainlist_##type *l_a2=NULL;\
|
array_chainlist_##type *l_a2=NULL;\
|
||||||
size_t i1=0, /*i=0,j=0, */ i2=0;\
|
size_t i1=0, /*i=0,j=0, */ i2=0;\
|
||||||
@@ -2671,10 +2691,10 @@ void parse_file_InputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, te
|
|||||||
for(size_t i=0;i<ddim2->rank;++i) ddim2->shape[i] = dim->shape[ dim->rank - pivotSplit + i];\
|
for(size_t i=0;i<ddim2->rank;++i) ddim2->shape[i] = dim->shape[ dim->rank - pivotSplit + i];\
|
||||||
dim2->shape[0] = dim->shape[0];\
|
dim2->shape[0] = dim->shape[0];\
|
||||||
for(size_t i=1;i<dim2->rank;++i) dim2->shape[i] = ddim2->shape[i-1];\
|
for(size_t i=1;i<dim2->rank;++i) dim2->shape[i] = ddim2->shape[i-1];\
|
||||||
updateRankDim(dim1);\
|
updateDim(dim1);\
|
||||||
updateRankDim(ddim1);\
|
updateDim(ddim1);\
|
||||||
updateRankDim(ddim2);\
|
updateDim(ddim2);\
|
||||||
updateRankDim(dim2);\
|
updateDim(dim2);\
|
||||||
*Tpart1 = create_tensor_##type(dim1);\
|
*Tpart1 = create_tensor_##type(dim1);\
|
||||||
*Tpart2 = create_tensor_##type(dim2);\
|
*Tpart2 = create_tensor_##type(dim2);\
|
||||||
initDim=true;\
|
initDim=true;\
|
||||||
@@ -2723,8 +2743,8 @@ void parse_file_InputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, te
|
|||||||
ddim2 = create_dim(pivotSplit);\
|
ddim2 = create_dim(pivotSplit);\
|
||||||
for(size_t i=0;i<ddim1->rank;++i) ddim1->shape[i] = dim->shape[i];\
|
for(size_t i=0;i<ddim1->rank;++i) ddim1->shape[i] = dim->shape[i];\
|
||||||
for(size_t i=0;i<ddim2->rank;++i) ddim2->shape[i] = dim->shape[dim->rank - pivotSplit + i];\
|
for(size_t i=0;i<ddim2->rank;++i) ddim2->shape[i] = dim->shape[dim->rank - pivotSplit + i];\
|
||||||
updateRankDim(ddim1);\
|
updateDim(ddim1);\
|
||||||
updateRankDim(ddim2);\
|
updateDim(ddim2);\
|
||||||
initDim=true;\
|
initDim=true;\
|
||||||
}\
|
}\
|
||||||
type x= 0;\
|
type x= 0;\
|
||||||
@@ -2782,7 +2802,7 @@ tensor_##type ** fromInput_to_array_tensor_##type(tensor_##type *tens){\
|
|||||||
tensor_##type **re_tens=malloc((tens->dim)->shape[0]*sizeof(tensor_##type *));\
|
tensor_##type **re_tens=malloc((tens->dim)->shape[0]*sizeof(tensor_##type *));\
|
||||||
dimension *dim=create_dim((tens->dim)->rank - 1);\
|
dimension *dim=create_dim((tens->dim)->rank - 1);\
|
||||||
for(size_t i=0; i<dim->rank; ++i) dim->shape[i]=(tens->dim)->shape[i+1];\
|
for(size_t i=0; i<dim->rank; ++i) dim->shape[i]=(tens->dim)->shape[i+1];\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
for(size_t i=0; i < (tens->dim)->shape[0];++i){\
|
for(size_t i=0; i < (tens->dim)->shape[0];++i){\
|
||||||
re_tens[i]=create_tensor_from_cpy_dim_##type(dim);\
|
re_tens[i]=create_tensor_from_cpy_dim_##type(dim);\
|
||||||
for(size_t j=0; j<dim->size; ++j) (re_tens[i])->x[j] = tens->x[i*(dim->size) + j ] ;\
|
for(size_t j=0; j<dim->size; ++j) (re_tens[i])->x[j] = tens->x[i*(dim->size) + j ] ;\
|
||||||
@@ -2822,7 +2842,7 @@ tensor_##type * create_tensor_from_list_array_##type( array_chainlist_##type *l_
|
|||||||
dim->shape[i]=miss_part_d;\
|
dim->shape[i]=miss_part_d;\
|
||||||
\
|
\
|
||||||
}\
|
}\
|
||||||
updateRankDim(dim);\
|
updateDim(dim);\
|
||||||
tensor_##type *tens= create_tensor_##type(dim);\
|
tensor_##type *tens= create_tensor_##type(dim);\
|
||||||
tmp=l_a;\
|
tmp=l_a;\
|
||||||
while(tmp){\
|
while(tmp){\
|
||||||
@@ -2847,7 +2867,7 @@ tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org){\
|
|||||||
size_t dimrnk = (org->dim)->rank; \
|
size_t dimrnk = (org->dim)->rank; \
|
||||||
dimension *dim_tr=create_dim(dimrnk);\
|
dimension *dim_tr=create_dim(dimrnk);\
|
||||||
for(size_t i=0; i<dimrnk; ++i) dim_tr->shape[i]=(org->dim)->shape[(dimrnk-1)-i];\
|
for(size_t i=0; i<dimrnk; ++i) dim_tr->shape[i]=(org->dim)->shape[(dimrnk-1)-i];\
|
||||||
updateRankDim(dim_tr);\
|
updateDim(dim_tr);\
|
||||||
printDebug_dimension(dim_tr,"dim_tr");\
|
printDebug_dimension(dim_tr,"dim_tr");\
|
||||||
tensor_##type *tens_tr = create_tensor_##type(dim_tr);\
|
tensor_##type *tens_tr = create_tensor_##type(dim_tr);\
|
||||||
size_t *coord = malloc((dimrnk)*sizeof(size_t));\
|
size_t *coord = malloc((dimrnk)*sizeof(size_t));\
|
||||||
@@ -2862,11 +2882,38 @@ tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org){\
|
|||||||
return tens_tr;\
|
return tens_tr;\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
|
tensor_##type * transpose_Opt0_tensor_##type(tensor_##type *org){\
|
||||||
|
size_t dimrnk = org->rank;\
|
||||||
|
dimension *dim_tr=create_dim(dimrnk);\
|
||||||
|
for(size_t i=0; i<dimrnk; ++i) dim_tr->shape[i]=(org->dim)->shape[(dimrnk-1)-i];\
|
||||||
|
updateDim(dim_tr);\
|
||||||
|
printDebug_dimension(dim_tr,"dim_trOpt");\
|
||||||
|
tensor_##type *tens_tr = CREATE_TENSOR_##type(dim_tr);\
|
||||||
|
long int cur_tr=0, add_tr=0, minus_tr=0;\
|
||||||
|
tens_tr->x[cur_tr] = org->x[cur_tr];\
|
||||||
|
for(size_t i=1; i<dim_tr->size; ++i){\
|
||||||
|
minus_tr =0;\
|
||||||
|
/*printf("DEBUG: cur_tr=%ld\n",cur_tr);*/\
|
||||||
|
for(size_t l=0; l<dimrnk; ++l){ \
|
||||||
|
add_tr = minus_tr + dim_tr->base[l+1];\
|
||||||
|
if(cur_tr + add_tr < dim_tr->base[l]){\
|
||||||
|
cur_tr += add_tr;\
|
||||||
|
/*tens_tr->x[cur_tr] = org->x[i]*/;\
|
||||||
|
tens_tr->x[i] = org->x[cur_tr];\
|
||||||
|
break;\
|
||||||
|
}\
|
||||||
|
minus_tr -= (dim_tr->base[l]-dim_tr->base[l+1]);\
|
||||||
|
}\
|
||||||
|
/*printf("DEBUG: after cur_tr=%ld\n",cur_tr);*/\
|
||||||
|
}\
|
||||||
|
return tens_tr;\
|
||||||
|
}\
|
||||||
|
\
|
||||||
tensor_##type * shapeute_notOpt_tensor_##type(tensor_##type *org, dimension *dshape){\
|
tensor_##type * shapeute_notOpt_tensor_##type(tensor_##type *org, dimension *dshape){\
|
||||||
size_t dimrnk = (org->dim)->rank; \
|
size_t dimrnk = (org->dim)->rank; \
|
||||||
dimension *dim_tr=create_dim(dimrnk);\
|
dimension *dim_tr=create_dim(dimrnk);\
|
||||||
for(size_t i=0; i<dimrnk; ++i) dim_tr->shape[i]=(org->dim)->shape[(dimrnk-1)-i];\
|
for(size_t i=0; i<dimrnk; ++i) dim_tr->shape[i]=(org->dim)->shape[(dimrnk-1)-i];\
|
||||||
updateRankDim(dim_tr);\
|
updateDim(dim_tr);\
|
||||||
printDebug_dimension(dim_tr,"dim_tr");\
|
printDebug_dimension(dim_tr,"dim_tr");\
|
||||||
tensor_##type *tens_tr = create_tensor_##type(dim_tr);\
|
tensor_##type *tens_tr = create_tensor_##type(dim_tr);\
|
||||||
size_t *coord = malloc((dimrnk)*sizeof(size_t));\
|
size_t *coord = malloc((dimrnk)*sizeof(size_t));\
|
||||||
|
|||||||
Reference in New Issue
Block a user